first commit
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
#include "OsSample.h"
|
||||
#include "canDriver.h"
|
||||
#include "ScHHS.h"
|
||||
|
||||
CAN_DRIVER can;
|
||||
|
||||
#define CAN_QUEUE_RECV_NUM 100000 //CAN接收队列长度
|
||||
#define CAN_QUEUE_SEND_NUM 100000 //CAN发送队列长度
|
||||
|
||||
QueueHandle_t CanRecvQueue;
|
||||
QueueHandle_t CanSendQueue;
|
||||
|
||||
//初始化CAN任务相关队列,数组等等
|
||||
Status CanProcessInit(void)
|
||||
{
|
||||
CanRecvQueue = xQueueCreate(CAN_QUEUE_RECV_NUM, sizeof(CAN_PKG));
|
||||
CanSendQueue = xQueueCreate(CAN_QUEUE_SEND_NUM, sizeof(CAN_PKG));
|
||||
}
|
||||
//关联驱动函数
|
||||
Status CanFuncRegister(uint8_t DeviceType)
|
||||
{
|
||||
switch (DeviceType)
|
||||
{
|
||||
case SC_HHS:
|
||||
//四川和华盛的USB CAN
|
||||
can = ScHHScanDriver;
|
||||
return SUCCESS;
|
||||
case ZLG_USB_CAN_II:
|
||||
//周立功的USB CAN II & PRO
|
||||
return SUCCESS;
|
||||
case GC_USB_CAN_II:
|
||||
//广诚科技的USB CAN II
|
||||
return SUCCESS;
|
||||
default:
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
//打开CAN
|
||||
Status CanFuncOpen(uint8_t chnl)
|
||||
{
|
||||
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
#include "OsSample.h"
|
||||
#include "work.h"
|
||||
#include "canDriver.h"
|
||||
#include "network.h"
|
||||
|
||||
#define APP_NAME "UniversalCan"
|
||||
|
||||
int SearchPreProcess(const char* processName);
|
||||
void KillPreProcess(const char* processName);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
//此程序必须只有一个进程在运行
|
||||
while (SearchPreProcess(APP_NAME) == ENABLE)
|
||||
{
|
||||
//杀死上一个进程
|
||||
KillPreProcess(APP_NAME);
|
||||
printf("Kill Pre Process\n");
|
||||
//等待进程里面的socket和内存被释放
|
||||
vTaskDelay(500);
|
||||
}
|
||||
// 初始化队列和任务等等
|
||||
// 初始化网络
|
||||
NetProcessInit(LISTEN_PORT);
|
||||
// 初始化CAN
|
||||
CanProcessInit();
|
||||
// 初始化network
|
||||
|
||||
vTaskStartScheduler();
|
||||
}
|
||||
|
||||
// 查找是否有指定名称的进程在运行(排除自身)
|
||||
int SearchPreProcess(const char* processName)
|
||||
{
|
||||
char cmd[512];
|
||||
|
||||
#ifdef _WIN32
|
||||
DWORD currentPID = GetCurrentProcessId();
|
||||
// Windows 下通常需要 .exe 后缀,建议传入时带上或在这里处理
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"tasklist | findstr \"%s\" | findstr /v \"%lu\" > nul",
|
||||
processName, currentPID);
|
||||
#elif defined(__linux__)
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"pgrep -x \"%s\" | grep -v %d > /dev/null 2>&1",
|
||||
processName, getpid());
|
||||
#endif
|
||||
|
||||
return system(cmd) == 0 ? ENABLE : DISABLE;
|
||||
}
|
||||
|
||||
// 杀死指定名称的同名进程(排除自身)
|
||||
void KillPreProcess(const char* processName)
|
||||
{
|
||||
char cmd[512]; // 稍微加大 buffer 以防万一
|
||||
|
||||
#ifdef _WIN32
|
||||
DWORD currentPID = GetCurrentProcessId();
|
||||
// 逻辑不变,仅参数化进程名
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"for /f \"tokens=2\" %%a in ('tasklist ^| findstr \"%s\"') do if not %%a==%lu taskkill /F /PID %%a",
|
||||
processName, currentPID);
|
||||
#elif defined(__linux__)
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"pgrep -x \"%s\" | grep -v %d | xargs -r kill -9 > /dev/null 2>&1",
|
||||
processName, getpid());
|
||||
#endif
|
||||
system(cmd);
|
||||
}
|
||||
+182
@@ -0,0 +1,182 @@
|
||||
#include "network.h"
|
||||
#include "work.h"
|
||||
|
||||
Socket_t context;
|
||||
|
||||
#define SOCKET_QUEUE_SEND_NUM 100000 //SOCKET接收队列长度
|
||||
#define SOCKET_QUEUE_RECV_NUM 100000 //SOCKET发送队列长度
|
||||
|
||||
QueueHandle_t SocketRecvQueue;
|
||||
QueueHandle_t SocketSendQueue;
|
||||
|
||||
void NetLoopTask(void *p);
|
||||
void NetReciveTask(void *p);
|
||||
void NetAnalysis(char *data);
|
||||
void NetPkgSend(char *data);
|
||||
void NetReciveQueueTask(void *p);
|
||||
void NetSendQueueTask(void *p);
|
||||
|
||||
Status NetProcessInit(uint32_t Port)
|
||||
{
|
||||
//初始化
|
||||
if (xSocketInitEnvironment() == SOCKET_SUCCESS)
|
||||
{
|
||||
printf("socket init success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("socket init error\n");
|
||||
return ERROR;
|
||||
}
|
||||
// 创建
|
||||
context = xSocketCreateUDP();
|
||||
// 绑定
|
||||
if (xSocketBind(context,Port) == SOCKET_SUCCESS)
|
||||
{
|
||||
printf("socket listen success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("socket listen error\n");
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
SocketRecvQueue = xQueueCreate(SOCKET_QUEUE_RECV_NUM, PKG_LEN);
|
||||
SocketSendQueue = xQueueCreate(SOCKET_QUEUE_SEND_NUM, PKG_LEN);
|
||||
|
||||
//开启任务
|
||||
xTaskCreate(NetReciveTask, /*!< 任务函数 */
|
||||
"NetReciveTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
|
||||
xTaskCreate(NetReciveQueueTask, /*!< 任务函数 */
|
||||
"NetReciveQueueTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
|
||||
xTaskCreate(NetSendQueueTask, /*!< 任务函数 */
|
||||
"NetSendQueueTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
|
||||
//网络循环执行任务
|
||||
xTaskCreate(NetLoopTask, /*!< 任务函数 */
|
||||
"NetLoopTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
}
|
||||
|
||||
//udp接收任务
|
||||
void NetReciveTask(void *p)
|
||||
{
|
||||
char PcRecvBuf[PKG_LEN]; // 接收缓冲区
|
||||
char PcRemoteIP[16]; // 存放谁发过来的 IP
|
||||
uint16_t PcRemotePort; //存放谁发过来的端口
|
||||
int PkgLen; //接收长度
|
||||
|
||||
while (1)
|
||||
{
|
||||
PkgLen = xSocketReceiveFrom(context,PcRecvBuf,PKG_LEN,PcRemoteIP,&PcRemotePort);
|
||||
if (PkgLen == PKG_LEN)
|
||||
{
|
||||
xQueueSend(SocketRecvQueue,PcRecvBuf,portMAX_DELAY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//udp解析函数
|
||||
void NetAnalysis(char *data)
|
||||
{
|
||||
switch (data[1])
|
||||
{
|
||||
case PKG_OPEN_CAN:
|
||||
//打开CAN
|
||||
CanFuncRegister(data[2]);
|
||||
CanFuncOpen(data[3]);
|
||||
break;
|
||||
case PKG_CLOSE_CAN:
|
||||
//关闭CAN
|
||||
break;
|
||||
case PKG_CTRL_CAN:
|
||||
//收发CAN
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//心跳包
|
||||
void NetHeart(void)
|
||||
{
|
||||
static char heart[PKG_LEN];
|
||||
heart[0] = PHEAD;
|
||||
heart[1] = PKG_HEART;
|
||||
heart[2] = work.status;
|
||||
heart[3] = work.product;
|
||||
heart[4] = work.chnlNum;
|
||||
heart[5] = work.canFd;
|
||||
|
||||
for (uint8_t i = 6; i < PKG_LEN; i++)
|
||||
{
|
||||
heart[i] = DISABLE;
|
||||
}
|
||||
|
||||
heart[PKG_LEN - 1] = PEND;
|
||||
|
||||
NetPkgSend(heart);
|
||||
}
|
||||
|
||||
//网络循环任务
|
||||
void NetLoopTask(void *p)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
//发送心跳包
|
||||
// NetHeart();
|
||||
vTaskDelay(500);
|
||||
}
|
||||
}
|
||||
|
||||
//udp队列接收任务
|
||||
void NetReciveQueueTask(void *p)
|
||||
{
|
||||
char PcRecvBuf[PKG_LEN]; // 接收缓冲区
|
||||
|
||||
while(1)
|
||||
{
|
||||
xQueueReceive(SocketRecvQueue,&PcRecvBuf,portMAX_DELAY);
|
||||
|
||||
NetAnalysis(PcRecvBuf);
|
||||
}
|
||||
}
|
||||
|
||||
//网络数据包发送
|
||||
void NetPkgSend(char *data)
|
||||
{
|
||||
data[0] = PHEAD;
|
||||
data[PKG_LEN - 1] = PEND;
|
||||
xQueueSend(SocketSendQueue,data,portMAX_DELAY);
|
||||
}
|
||||
|
||||
//网络数据包发送队列
|
||||
void NetSendQueueTask(void *p)
|
||||
{
|
||||
static uint16_t SendPort = SEND_PORT;
|
||||
char PcSendBuf[PKG_LEN]; // 接收缓冲区
|
||||
|
||||
while(1)
|
||||
{
|
||||
xQueueReceive(SocketSendQueue,&PcSendBuf,portMAX_DELAY);
|
||||
|
||||
xSocketSendTo(context,PcSendBuf,PKG_LEN,"127.0.0.1",SendPort);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#include "work.h"
|
||||
|
||||
WORK_STATUS work;
|
||||
Reference in New Issue
Block a user