首页| 论坛| 消息

标题:在QT程序中使用pthread创建串口接收线程所出现的问题
作者:phenix_yw
日期:2006-08-09 15:28
内容:

下面这个函数作为串口接收线程的执行函数(本程序用的是pthread线程库)

1 #define BUFFERSIZE 32,
2
3 void *readPort_thread(void *classPtr)
4 {
5 commGUI *gui_ptr=(commGUI *)classPtr;
6 char rbuff[BUFFERSIZE];
7 int res;
8
9 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
10 if(res != 0){
11 perror("setcacelstate failed");
12 exit(EXIT_FAILURE);
13 }
14
15 res=pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
16 if(res != 0){
17 perror("setcaceltype failed");
18 exit(EXIT_FAILURE);
19 }
20 while(true){
21 gui_ptr->recvBytes+=gui_ptr->port_instance->readPort(rbuff,BUFFERSIZE);
22 //显示接收字节数
23 gui_ptr->recv_lineEdit->setText(QString::number(gui_ptr->recvBytes));
24
25 //在TextView控件里显示
26 if(!gui_ptr->isDisplayStop)
27 gui_ptr->recv_TextView->append(QString(rbuff));
28 //在终端里显示
29 printf("%s",rbuff);
30 fflush(stdout);
31 }
32 }
将两台PC(主机A,主机B)通过串口相连,主机A系统是WindowsXP,使用一个串口调试程序配合本程序的调试,主机B即为运行本程序的linux机器
现在有以下两个问题:
1.主机A以一秒的周期向 ..


#1 [realwerw 08-10 12:01]
这种问题我遇到过多次
1)第一个问题是因为串口有个缓冲区,接收到的数据会保存在里面。你如果直接read()串口时,他要达到
一定数量的数据满足时才会发给你(我记得默认为8吧).如果不够,read会被阻塞。
解决办法:可以设置串口的寄存器属性里面有一项,
stTm.c_cc= 1 //超时时间
stTm.c_cc=MIN_NUMBER //你要read到多少个数据就返回
tcsetattr(fd,TCSANOW,&stTm);
2)建议你用个strBuffer装着吧,然后setText
#2 [phenix_yw 08-10 16:50]
谢谢realwerw的解答,不过程序中造成的接收显示延迟不是串口设置的问题,好像跟Xlib或者用来显示接收数据的TextView控件有关,如果我只让接收的数据在终端上显示(即直接printf),接收数据的数据是能实时显示的,但如果在TextView中显示就会出现上述的等待现象,并且终端中还时不时的冒出这样的信息:
Xlib: unexpected async reply (sequence 0x12e4)!
是Qt 库的问题吗?
#3 [phenix_yw 08-15 09:21]
没高手帮忙呀??
都郁闷好几天了!救命呀!
#4 [ball 08-22 11:49]
用 QThread 吧
用 Qt 不用 QThread 等於白用

回复 发表
主题 版块