有点急!!!!rs485数据接收问题
rs485发送时间问题下面是源码。
可是发送的时间就是这个tcdrain()等待函数浪费时间,把这个函数去掉的话就不能工作了用延时函数也打不到效果,是内核缓冲区的数据发送太慢,应用怎么可以提高发送速度吗?
问题描述:tcdrain()函数是等待发送缓冲区的数据发送完成,但是太费时间了,pc机给卡开发板发送指令开始采集消费记录的时候,开发板给pc机发送消费记录,当发送一笔消费记录以后,收不到pc机给开发板的应答,而是直接受到下一条指令,用串口调试工具也看见pc机发送数据了,但是开发板却没有受到。
确定原因:是pc机发送第一条指令的时候485串口处在电平拉高状态(就是开发板高低电平切换的那段时间正好是pc机数据发送的那个时间),这个与驱动有关系吗?还是内核cup调度的原因?
串口发送代码:
/***************************************/
setRTS(uartfd,1);//拉高
if(write(uartfd,buffer,len) < 0)//发送
perror("write_rs485 uartfd ERR: ");
tcdrain(uartfd); //等待串口数据传输完成
setRTS(uartfd,0);//拉低
/***************************************/
串口接收代码
/***********************************/
setRTS(uartfd,0);
if((size = read(uartfd, rbuf, MAXCOMMBUFFSIZE)) == -1)//接收
return ;
if (size > 0)
{
for(i = 0;i < size;i++)//接收缓冲区的数据移动
{
cur_write++;
if (cur_write >= MAXCOMMBUFFSIZE)//MAXCOMMBUFFSIZE = 150
cur_write = 0;
buffer[cur_write] = rbuf[i];
}
}
串口设置代码如下:
struct termios cAttr;//rs485无校验,一个停止位
memset(&cAttr,0,sizeof(struct termios));
cAttr.c_iflag = IGNPAR;//忽略奇偶校验
cAttr.c_cflag = B19200 | HUPCL| CS8 | CREAD | CLOCAL &~CSTOPB;//HUPCL 最后关闭时挂线(放弃DTR),CREAD接收使能,CLOCAL不改变接收所有者,CSTOPB一个停止位
cAttr.c_cc[VTIME] = 0;//接收等待时间
cAttr.c_cc[VMIN] = 1;//接收最小字节
if(tcsetattr(uartfd,TCSANOW,&cAttr) < 0)
perror("tcsetattr ERR");
usleep(1000);
setRTS(uartfd,0);
/************************************/