广东湘恒智能科技有限公司
主营产品: 西门子PLC代理商,plc变频器,伺服电机,人机界面,触摸屏,线缆,DP接头
SIEMENS江苏省常州市 西门子代理商——西门子华东一级总代理

2.2 获取信号量

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

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














































//打印任务函数void print_task(void *pvParameters){    int count=0;    BaseType_t err = pdFALSE;
   int size=50;    uint8_t buf[64];//最多只取前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};//限定最多接收4个参数    para[0] = strtok(paras, " ");    int j= 1;    while(paras != NULL)//这里有点小问题,不可以提前结束    {        para[j++] = strtok(NULL, " ");        if(j==4)            break;    }
   //执行对应的函数    struct_dostr1[i].fun(para);}

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




























#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;}


展开全文
相关产品
商铺首页 拨打电话 QQ联系 发送询价