加入收藏 在线留言 联系我们
关注微信
手机扫一扫 立刻联系商家
全国服务热线15915421161

SIEMENS江苏省常州市 西门子代理商——西门子华东一级总代理

更新时间
2024-07-04 07:00:00
价格
请来电询价
西门子总代理
PLC
西门子一级代
驱动
西门子代理商
伺服电机
联系电话
15903418770
联系手机
15915421161
联系人
张经理
立即询价

详细介绍
2.2 获取信号量

编写一个任务来实现串口数据的获取,该任务不断尝试获取信号量,获取成功后,对数据进行处理。

获取信号量xSemaphoreTake,阻塞(等待时间)10ms,获取不到信号量则向下执行,每个任务都是一个死循环,马上又会进行信号量获取。














































//打印任务函数void print_task(void *pvParameters){    int count=0;    BaseType_t err = pdFALSE;
   int size=50;    uint8_t buf[64];//Zui多只取前64个数据
   //清空本地接收数组    memset(buf,0,size);
   while(1)    {        err=xSemaphoreTake(uartSemaphore,10);   //获取信号量        if(err==pdTRUE)                         //获取信号量成功        {              //printf("%s",Data);            if(rx_cnt < size)//收到的数据长度在size范围内            {                //void *memcpy(void *str1, const void *str2, size_t n)                  //从存储区 str2 复制 n 个字节到存储区 str1。                memcpy(buf,Recv,rx_cnt);//有几个复制几个                count=rx_cnt;                //printf("%s\r\n", buf);            }            else//收到的数据长度太长了            {                memcpy(buf,Recv,size);//只复制size个                count=size;            }            rx_cnt=0;        }
       if(count>0)        {            count=0;            printf("receive:%s",buf);
           //------------------------------------------------------------------------------            //这里可以继续对buf进行分析和处理,比如根据buf的不同内容执行不同的小任务
       }    }}

2.3 一个小应用

结合之前文章介绍的字符串操作的相关知识:C语言字符串相关函数使用示例 strtok_r strstr strtok atoi,可以对“命令+参数”型的字符串数据进行处理。





































//先判断指令名称char *cmd;//表示命令char *paras;//表示命令后的参数cmd = strtok_r((char*)buf, " ", &paras);//这里有点小问题,不带参数的命令,后面需要一个空格
char *ret;int i;for (i = 0; i < N;i++){    ret = strstr(struct_dostr1[i].name, cmd);    if(ret!=NULL)    {//        printf("find cmd in funname[%d]\r\n", i);        break;    }}if(i==N){    printf("can't find cmd in funname[]\r\n");}else{                  //是有效的指令,继续判断后续参数    char* para[4]={0};//限定Zui多接收4个参数    para[0] = strtok(paras, " ");    int j= 1;    while(paras != NULL)//这里有点小问题,不可以提前结束    {        para[j++] = strtok(NULL, " ");        if(j==4)            break;    }
   //执行对应的函数    struct_dostr1[i].fun(para);}

Zui后的函数执行,是通过定义一个结构体,将字符命令与函数指针对应起来:




























#define N 2typedef struct struct_dostr{char name[32];int (*fun)(char *argv[]);}struct_dostr;
struct_dostr struct_dostr1[N]={{"hello",hello},{"led",  led},  };
int hello(char* p[]){    printf("hello~~~~~~~~~~\r\n");    return 0;}
int led(char* p[]){    int p0,p1;    p0=atoi(p[0]);    p1=atoi(p[1]);
   printf("get led: %d, %d\r\n",p0,p1);    return 0;}


相关产品

联系方式

  • 电  话:15903418770
  • 联系人:张经理
  • 手  机:15915421161
  • 微  信:15915421161