下面是一个串口接收数据的程序,我希望在接收当前数据的过程中,如果再来一组数据,需要把当前的数据接收完毕之后再接收后来的数据,保证数据正确性,用了2进制信号量
semRecv = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
int tyRecv(int fd)
{
int readCnt0;
char rd;
char buff[512];
int i;
semRecv = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
FOREVER
{
i=0;
taskDelay(50);
ioctl(fd,FIONREAD,(int) &readCnt0);
semTake(semRecv, WAIT_FOREVER);
if(readCnt0>0)
{
while(readCnt0>0)
{
read(fd,&rd,1);
readCnt0--;
buff[i++]=rd;
}
buff[i]='\0';
printf("%s\n",buff);
}
semGive(semRecv);
}
}
但是接收数据的时候如果同时来了两个数据,还是一起显示出来了,并没有分2次显示
请问问题是出在哪里了?
另外,再问一个问题,我想把采集到的数据放到内存中的一个固定地址,需要怎么做?
------解决方案--------------------
硬件的串口接收缓冲区接收数据是硬件自动完成的。信号量在这里使用不太合适。当前一组数据接收完之后,如果你没能及时显示,后一组数据也会接收完毕。一旦你显示第一组数据,那么第2组数据也会紧接着显示,形成两组同时显示的效果。而信号量的逻辑并没有任何错误。
如果你希望每次写到某个固定的物理地址,那么可以强制性的将一个数组定义到某一绝对地址的内存上,这要求你知道该段内存存在。并且访问该段内存或数组时,需要像访问外设一样来进行访问,也就是要用驱动函数。因为,操作系统禁止用户直接访问硬件设备。