串口循环读并且显示在textview中的问题

发布于 2022-08-18 05:09:57 字数 5801 浏览 11 评论 0

我编写了一个gtk串口循环接收发送程序(包含一个textview和一个接收按钮和关闭按钮),用于从另一台设备中接收数据并显示在textview中,然后再发送回那台设备。
在串口接收数据后,当接收到数据并显示到textview后,再发送,发送完后又返回接收。可是进行这样循环时,gtk窗口无法显示数据,数据只能在调试串口中显示。不知道如何实现?

int Recv_Data(gpointer data)
{
        int ret,i;
        int fp,nread,nwrite;
        char buff[16]="";
        char pbuff[16]="";

         fp = open(IRDA_PORT,O_RDWR);//打开红外口
         if(fp < 0){
                        perror("open port error!n");
   }
          ret = SetSerialPort(fp,9600,8,1,'N');/*设置红外口参数*/       
         if(ret != 0){
                   printf("init port error!n");
   }
       
                        fd_set fds;
                         struct timeval timeout;                          /*设置超时*/
                        timeout.tv_sec = 0;
                        timeout.tv_usec = 10*1000;                         /* 100ms */
                        FD_ZERO (&fds);                                        //每次循环都要清空集合,否则不能检测描述符变化                                                              
                        if(fp != -1){
                                FD_SET (fp, &fds);                        //添加描述符
                        }                                                    
                        ret=select (fp+1, &fds, NULL, NULL, &timeout);
               
        while(1){
                /***********读串口********************/
                nread = read(fp, buff, RECV_MAX);        /*RECV_MAX=5*/
                if(nread > 0){
                        printf("read %d data to COM : n",nread);
                        append_text_buffer(textbuffer,buff);
                        append_text_buffer(textbuffer,"n");
                        //数据处理
                        int temp;                                                               
                        for(i = 0; i < RECV_MAX/2; i++){
                                temp = buff;
                                buff = buff[RECV_MAX-i-1];
                                buff[RECV_MAX-i-1] = temp;
                        }
                        nwrite=write(fp,buff,RECV_MAX);      /*SEND_MAX=5*/
          }
          else
          {
                  printf("waitint for data ...n");
          }

        }
                  
          return 0;
}

红色部分用于将数据显示到textview中,这样进行循环,无法显示接收到的数据,而且两个按钮也不能响应点击事件?哪位大侠知道怎么回事?请指教?gtk窗口一用循环或者sleep,就无法正常显示?用gkt_timeout_add()有时可以解决一些问题,但无法解决循环问题。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文