first commit

This commit is contained in:
liyp
2026-08-25 22:10:31 -04:00
commit dde12bf30b
41 changed files with 1379 additions and 0 deletions
+43
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
}
+3
View File
@@ -0,0 +1,3 @@
#include "work.h"
WORK_STATUS work;