下面这个函数作为串口接收线程的执行函数(本程序用的是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以一秒的周期向主机B发送一个字符串,但主机B有时却并不是收到一个字符串就立即在终端和TextView里显示,要等会儿它才一下子显示多个字符串,且在等待的过程中,界面上的控件都不能响应鼠标,有时还会造成程序僵死.
在终端上有时还出现类似这样的信息:
Xlib: unexpected async reply (sequence 0x1167)!
但如果注释掉26,27行,即只让接收到的字符串在终端中显示,则接收显示正常,不会出现以上所说的问题.
2.TextView类的append方法会把接收到的字符串去除换行符,而且每接受一个字符串它都会追加到下一行,这样并不适合用来显示串口接收的数据,要原版显示串口所收到的数据应该怎么办?
请高人指点一下应该怎样解决以上问题呢?
[ 此贴被phenix_yw在2006-08-10 10:09重新编辑 ]