有点急!!!!rs485数据接收问题

帅哥强001 2014-02-25 09:08:46
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);
/************************************/
...全文
736 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅哥强001 2014-03-03
  • 打赏
  • 举报
回复
引用 5 楼 falloutmx 的回复:
最好的方法就是抓波形。他们说的不正确,linux提供的只是标准串口,仅RS232的。485需要对CTS/RTS操作,一般都是放驱动里的,我不知道setRTS里面的代码,不知道里头是不是也通过ioctl进到驱动去了。 既然是外包,那肯定有验收标准。他们说能达到某个速率,就请他们给个测试程序,跑起来没问题的。
setRTS函数就是一个ioctl设置高低电平的操作,其他的就没了
falloutmx 2014-02-28
  • 打赏
  • 举报
回复
最好的方法就是抓波形。他们说的不正确,linux提供的只是标准串口,仅RS232的。485需要对CTS/RTS操作,一般都是放驱动里的,我不知道setRTS里面的代码,不知道里头是不是也通过ioctl进到驱动去了。 既然是外包,那肯定有验收标准。他们说能达到某个速率,就请他们给个测试程序,跑起来没问题的。
帅哥强001 2014-02-28
  • 打赏
  • 举报
回复
引用 3 楼 falloutmx 的回复:
不一定会好,毕竟不知道他们驱动的代码,说不定他们自身处理也有问题。不过你这样用setRTS一定是影响速度的。 能抓波形的话就抓下,看看DATA和RTS的相位关系就知道了
有没有好一点的解决办法啊,今天去他们公司问他们说读rs485的接口是linux提供的标准接口,处理高低电平也是在应用里处理的,我就不知道怎么办了,一个线程专门发送一个专门接收效果比以前好一点点,我就不知道更好的解决办法了,您有没有方法的告诉我一下下
falloutmx 2014-02-26
  • 打赏
  • 举报
回复
不一定会好,毕竟不知道他们驱动的代码,说不定他们自身处理也有问题。不过你这样用setRTS一定是影响速度的。 能抓波形的话就抓下,看看DATA和RTS的相位关系就知道了
帅哥强001 2014-02-26
  • 打赏
  • 举报
回复
谢谢你的回复 是linux 驱动是公司外包的,那你的意思就是把高低电平放在驱动中做就好了吗?简单来说就是高低电平的切换慢是吗?
falloutmx 2014-02-25
  • 打赏
  • 举报
回复
简单来说就是你485的效率不够呗。什么平台?驱动是自己写的吗? RTS高低电平切换能达到的最大速率能否满足波特率? 判断发送完成和RTS操作应该在驱动层做,在应用层速度不够快的。

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧