SIEMENS江苏省常州市 西门子代理商——西门子华东一级总代理
2.2 获取信号量
编写一个任务来实现串口数据的获取,该任务不断尝试获取信号量,获取成功后,对数据进行处理。
获取信号量xSemaphoreTake,阻塞(等待时间)10ms,获取不到信号量则向下执行,每个任务都是一个死循环,马上又会进行信号量获取。
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 *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);}
最后的函数执行,是通过定义一个结构体,将字符命令与函数指针对应起来:
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;}
展开全文
相关产品