60

帖子

0

TA的资源

一粒金砂(初级)

21
 
引用 19 楼 zhaomohan 的回复:
我也同样的问题,我是尽量减少线程数 ,提高线程优先级做的


线程数不好减少,一个串口也就对应一个接收线程。
楼上你做的线程优先级设置多少,速度提高了多少呢?

回复

77

帖子

0

TA的资源

一粒金砂(初级)

22
 
我觉得可能跟你的应用层程序设计有关系.
请问你的接收数据线程用的是异步操作还是同步?
如果是同步操作,那么你的接受线程有可能被阻塞
你的代码类似下面这段吗?

  1. while(ture) {
  2. ReadFile();
  3. }
复制代码

吗?
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

23
 
引用 21 楼 flandy1982 的回复:
我觉得可能跟你的应用层程序设计有关系.
请问你的接收数据线程用的是异步操作还是同步?
如果是同步操作,那么你的接受线程有可能被阻塞
你的代码类似下面这段吗?
C/C++ codewhile(ture) {
ReadFile();
}
吗?

是的,不过数据通信没有问题,就是速度慢
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

24
 
是读的慢还是发的慢,如果是发的慢应该就是波特率的事,没有过多办法。
如果是读的慢,把读的超时改小点,好好看看串口相关的API函数。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

25
 
波特率19200 传输数据500字节, 时间应该是 500 * 8 / 19200, 时间是远小于1秒的

建议使用异步方式..
如果你开了2个线程分别监控 串口0 串口1并且使用同步方式一直在线程中查询串口状态, 会出现线程被阻塞的情况
如, 如下代码:
thread0 {
    ReadFile();
}

thread1 {
    ReadFile();
}

thread0中如果有数据没有处理完就会一直占用CPU, 这样在thread0占用CPU的过程中thread1中收到的数据就会一直等到thread0处理完成后才能处理.

如果使用异步方式, thread0在接收到数据后会立即释放CPU控制权..


 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

26
 
用信号量不行吗。
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(中级)

27
 
我觉得串口用中断接收,然后,再直接来处理。
void  UART1_ISR(void)
{
   char  c;
   static INT16U rx_cut;
   static INT8U test_eof[4];
   c  =  UARTCharGet(UART1_BASE);
    if(c == 'h')
    {
      *UARTRxBuf = 'h';
      rx_cut = 1;
    }
    else if(rx_cut  < 17)
    {
      UARTRxBuf[rx_cut++] = c;
      test_eof[3] = test_eof[2];
      test_eof[2] = test_eof[1];
      test_eof[1] = test_eof[0];
      test_eof[0] = c;
      if((test_eof[3] == 0x3c)&&(test_eof[2] == 0xc3)&&(test_eof[1] == 0x33)&&(test_eof[0] == 0xcc))
       {
         OSSemPost(UARTRX);
       }
    }
    UARTIntClear(UART1_BASE , UART_INT_RX | UART_INT_RT);
}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 23 楼 vichard 的回复:
是读的慢还是发的慢,如果是发的慢应该就是波特率的事,没有过多办法。
如果是读的慢,把读的超时改小点,好好看看串口相关的API函数。


是读的慢,测试发现数据是分成两部分接收的,第一部分很快就收到了,但是第二部分就要间隔比较久后收到,可以确定问题就出在这里,如何控制数据一次性接收?或者控制分段传输的数据间隔不要那么长?是超时设置太短?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

29
 
引用 26 楼 lyj2009 的回复:
我觉得串口用中断接收,然后,再直接来处理。
void? UART1_ISR(void)
{
? char? c;
? static INT16U rx_cut;
? static INT8U test_eof[4];
? c? =? UARTCharGet(UART1_BASE);
? ? if(c == 'h')
? ? {
? ? ? *UARTRxBuf = 'h';
? ? ? rx_cut = 1;
? ? }
? ? else if(rx_cut? < 17)
? ? {
? ? ? UARTRxBuf[rx_cut++] = c;
? ? ? test_eof[3] = test_eof[2];
? ? ? test_eof[2] = test_eof[1];
? ? ? test_eof[1] = test_eof[0];
? ? ? test_eof[0] = c;
? ? ? if((test_eof[3] == 0x3c)&&(test_eof[2] == 0xc3)&&(test_eof[1] == 0x33)&&(test_eof[0] == 0xcc))
? ? ? {
? ? ? ? OSSemPost(UARTRX);
? ? ? }
? ? }
? ? UARTIntClear(UART1_BASE , UART_INT_RX | UART_INT_RT);
}


这中断是驱动的吧。
驱动收到后还要发给应用,如果上述方法不行,考虑在驱动里将接收数据保存在一个寄存器中,修改标志告诉应用层读取数据,不知道这种方式能否节约时间
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

30
 
学习中~~
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

31
 
引用 27 楼 wliaoc 的回复:
引用 23 楼 vichard 的回复:
是读的慢还是发的慢,如果是发的慢应该就是波特率的事,没有过多办法。
如果是读的慢,把读的超时改小点,好好看看串口相关的API函数。


是读的慢,测试发现数据是分成两部分接收的,第一部分很快就收到了,但是第二部分就要间隔比较久后收到,可以确定问题就出在这里,如何控制数据一次性接收?或者控制分段传输的数据间隔不要那么长?是超时设置太短?



应该是超时设置太长了,第一次读时数据立即就到了,但第二次读时没有数据,所以要等比较长的时间,查一下SetComTimeouts这个函数的用法,把Read interval及total timeouts都设小一些,或者禁至掉,函数名我记不清了,你查一下,COM的API好好看看就能解决,一两句说不清楚。

这是一个最常见的问题
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

32
 
SetComTimeouts这个函数在我创建串口线程类的时候就设置了,总共有5个参数,前三个表示接收超时设置。根据书上说法,第一个表示两个接收字符间的最大时间间隔,第二个表示平局读一个字符的时间上限,第三个表示读数据总超时总量。第一个参数我设置最大,后两个设置为0,表示不管是否有数据读取,ReadFile立刻返回。我把前三项改成0,表示没有超时设置,没有效果。把三项都赋值,感觉也没有变化,读取数据会分段接收,这是造成接收慢的关键所在,但是怎么设置才能解决?楼上能给出三个参数的具体值吗?我试试效果
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表