qt 使用select监听串口时主线程被阻塞

在QT中,另起一个线程读串口,使用select监听的,可是为什么主线程也被阻塞了呢?
代码如下:

thread.h

 #ifndef DISTANCE_SERIAL_PORT_H
#define DISTANCE_SERIAL_PORT_H

#include <QtCore/QThread>

class Distance_serial_port : public QThread
{
    Q_OBJECT
public:
    explicit Distance_serial_port(QObject *parent = 0);
    void run();
    void run_once();
    void setTermios(struct termios * pNewtio, int uBaudRate);
    void gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio);

};

#endif // DISTANCE_SERIAL_PORT_H

thread.cpp

 #include "distance_serial_port.h"
#include <sys/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <iostream>
#include <termios.h>

#define BUF_LENGTH 6
#define DEV_NAME "/dev/tty"

Distance_serial_port::Distance_serial_port(QObject *parent) :
    QThread()
{}
class CLASS_JULI{
   public:
    CLASS_JULI(int f = -1):fd(f){ }
      ~CLASS_JULI()
      {
        close(fd);
      }
      int fd;
};
CLASS_JULI dis_port_fds;
void Distance_serial_port::run(){

    while(1)
    {
       try{
          run_once();
       }
        catch(...){
          std::cerr<<"distance serial port  run throw exception!"<<std::endl;
       }

       sleep(1);
    }
}
void Distance_serial_port::run_once()
{
    int ret = 0,i;
    unsigned char buf_read[BUF_LENGTH];
    fd_set readfd;
    struct timeval timeout;
    struct termios oldtio, newtio;
    dis_port_fds.fd= open(DEV_NAME,O_RDONLY | O_NONBLOCK);

    if ((dis_port_fds.fd = open(DEV_NAME, O_RDONLY |  O_NONBLOCK)) <= 0) {
           std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl;
           return ;
    }
    else
    {
        std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl;
    }
    gps_uart_init(dis_port_fds.fd,&oldtio,&newtio);
    assert(dis_port_fds.fd>0);
    while(1)
    {
        timeout.tv_sec=1;
        timeout.tv_usec=0;
        FD_ZERO(&readfd);
        FD_SET(dis_port_fds.fd,&readfd);
        ///监控函数
        ret=select(dis_port_fds.fd+1,&readfd,NULL,NULL,&timeout);

        if(ret == -1) //错误情况
        {
            std::cout<<"error"<<std::endl ;
        }
        else if(ret>0) //返回值大于0 有数据到来
        {

            if(FD_ISSET(dis_port_fds.fd,&readfd))
            {
                i=read(dis_port_fds.fd,buf_read,BUF_LENGTH);
                std::cout<<"----------------------------------------"<<std::endl;
                int m = 0;
                for(m = 0; m < BUF_LENGTH ; m++)
                {
                    std::cout<<buf_read[m]<<" "<<std::endl;
                }

                if(buf_read[0] == 'D')
                {
                    char _buf = buf_read[1];
                     //QBitArray ba(8);
                    if( (_buf&0x80) == 1 )
                    {

                    }
                    else
                    {

                    }
                }
                break;
            }
            else //超时情况
            {
                std::cout<<"time out"<<std::endl;
                continue;
            }
        }
        else
        {
        }

    }

}

void Distance_serial_port::setTermios(struct termios * pNewtio, int uBaudRate)
{
    /*
     *clear struct for new port settings
     */
    bzero(pNewtio, sizeof(struct termios));
    //8N1
    pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;
    pNewtio->c_iflag = IGNPAR;
    pNewtio->c_oflag = 0;
    pNewtio->c_lflag = 0; //non ICANON
}

/*
 *设置串口的波特率9600,并刷新使其立即生效
 */
void Distance_serial_port::gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio)
{
        tcgetattr(ttyFd, oldtio); /* save current serial port settings */
        setTermios(newtio, B115200);
        tcflush(ttyFd, TCIFLUSH);
        tcsetattr(ttyFd, TCSANOW, newtio);
}

调用方法

 dis_serial_prot = new Distance_serial_port();
    dis_serial_prot->run();

为什么呢?难道在QT中不能使用select?

3个回答

晕,你写的类继承了QThread,创建对象后,run函数不是你调用的,是线程启动后自动调用的,你应调用start函数启动线程。你现在的代码写好了线程,但根本没用上多线程

opt.c_cc[VMIN] = 0 //最小时间设置为0
136 opt.c_cc[VTIME] = 1;//最小字节设置为1

llx2007
凌云志轩 回复凌云志轩: 2.TIME和MIN值 这两个值只用于非标准模式,两者结合共同控制对输入的读取方式,还能控制在一个程序试图与一个终端关联的文件描述符时将发生的情况 MIN = 0, TIME = 0时:read立即返回,如果有待处理的字符,它们就会被返回,如果没有,read调用返回0,且不读取任何字符 MIN = 0, TIME > 0时:有字符处理或经过TIME个0.1秒后返回 MIN > 0, TIME = 0时:read一直等待,直到有MIN个字符可以读取,返回值是字符的数量.到达文件尾时返回0 MIN > 0, TIME > 0时:read调用时,它会等待接收一个字符.在接收到第一个字符及其后续的每个字符后,启用一个字符间隔定时器.当有MIN个字符可读或两字符间的时间间隔超进TIME个0.1秒时,read返回 通过设置MIN和TIME值,我们可以逐个字符地对输入进行处理
接近 2 年之前 回复
llx2007
凌云志轩 额,写反了,应该是opt.c_cc[VTIME] = 0 //最小时间设置为0 ; opt.c_cc[VMIN] = 1;//最小字节设置为1
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# 使用Socket.ReceiveFrom时被异常阻塞
在语句:rnRecvBytesLength = UdpServer.ReceiveFrom(PictureBuf, offset, PictureBuf.Length, SocketFlags.None, ref RecvRemoteEp);rn中,只要offset不为0,即使有数据来了也一直阻塞在那里;但是offset为0时,有数据来了就不会阻塞。rn我把socket设置成非阻塞也不行:rnUdpServer.Blocking = false;rn发送方法SendTo也和ReceiveFrom出现同样的问题。rn难道offset只能用0值不成了???rn劳请大家指点。。。先谢谢了!
reachability阻塞主线程问题
请问在使用reachability判断网络状态时候发生阻塞主线程得问题,如何解决呢?
异步任务如何阻塞主线程
我在欢迎页面调用的百度定位的API,它是异步的任务,有时如果网络不够快,下面的代码继续执行时就会挂APP,因为欢迎页跳转后,后面的Activity有用到返回的数据,请问下大神有应该怎么阻塞它呢?我想让它返回结果后在继续执行我下面的代码
子线程暂停, 主线程阻塞?
MFC 对话框小程序中rn建立的子线程暂停后,为何无法控制对话框中按钮使用 MessageBox以及 AfxMessageBox ?rnrn网上搜索后有些迷糊,有人说用 MsgWaitForMultipleObject() 函数rn但是偶研究半天也没弄好, 各位大大能给个例子么?rn谢谢了rn @_@
模态对话框阻塞了主线程
我是基于对话框程序的,在程序里我创建了另外一个线程,在这个另外创建的线程的Initial()里面rn我用domodel创建了一个对话框,现象是,主对话框不能使用了,主线程好像被阻塞了,我已经创建另一个线程了rn就算是阻塞,也应该是阻塞新创建的那个线程,怎么会是主线程?
VC主线程阻塞
vc中主界面上设置了一个“移动”按钮,点击该按钮,新开一个线程控制一个电机移动。代码如下:rn主线程代码:rn[code=c]rnvoid CDlgFastApproachCTR::OnButtonAutoMovein() rnrncommand cmd;rn cmd.cmd= MOTOR_AUTO_FORWARD_NEW;rn send(g_socket,(const char*)&cmd, sizeof(command),0);rnrn hThread=CreateThread(NULL,rn 0,(LPTHREAD_START_ROUTINE)AutoForwardThread,NULL,0,&ThreadID);rn[/code]rn控制电机运动的代码:rn[code=c]rnvoid AutoForwardThread(LPDWORD param)rn TRACE0("motor move \r\n");rnrn //long int tid2 = GetCurrentThreadId();rn //CString strTid;rn //strTid.Format("%d",tid2);rn //TRACE0("thread2 id "+strTid+"\r\n");rn rn while (flag)rn rn //WaitForSingleObject(hMutex,INFINITE);rn // 电机向上移动0.4微米rn int nMoveStep=-1.2;rn m_SC300.Move(0,nMoveStep);rnrn CString strFlag;rn strFlag.Format("%d",flag);rn TRACE0("flag is "+strFlag+"\r\n");rn rn Sleep(200);rn rnrn[/code]rn可是实际运行中发现点击完“移动”按钮之后,但是主界面反应很慢或者卡死了,点击其它按钮反应很慢或者根本没任何反应了。这应该是主线程阻塞了吧,为什么会出现这样的情况?我就是新建了一个线程而已,求前辈指教~,感激不尽~img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif][/img]
监听触摸屏,鼠标,键盘的动作,他们的信息 --- select()阻塞监听
使用select函数还可以阻塞监听mouse,keyboard, touchscreen动作#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;linux/input.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt; #include &amp;lt;sys/time.h&amp;gt; ...
命名管道open时被阻塞了
有一个主进程和一个子进程,它们之间通过两个命名管道进行通信,只有在主进程kill子进程的时候才把命名管道删除,现在有这么一个问题,如果使用rnkill -9 子进程号 rn子进程杀掉后,在主进程打开命名管道时就被阻塞了,请问有什么解决方法么?rnrn
主线程阻塞 无法刷新窗体
主线程里有个数据库操作,因为数据库量比较大,所以耗时比较多,导致主线程一直停在那里,rn在上面new了个窗体,想要show出来时,却迟迟刷不出来,rn有什么好的办法木有啊?
WaitForSingleObject 无限等待,阻塞主线程
我在主界面点击按钮时弹出一个子界面,并开启一个线程,当我关闭子界面时,判断线程是否退出,如果没有退出,就用WaitForSingleObject(hThread_QAM,INFINITE); 进行等待,等到线程自己做完然后return.但是现在在这里wait变成无限等待了,主界面也一直阻塞住了...rnrnCWinThread* wThread;rnHANDLE hThread_QAM;rnrnwThread = AfxBeginThread(theProc_QAM,NULL);rnif( NULL != wThread) rn rn hThread_QAM = wThread-> m_hThread; rnrnrnUINT CQAMDlg::theProc_QAM(LPVOID p)rnrn return m_pThis->QAM();rnrnrnDWORD CQAMDlg::QAM()rnrn if (INVALID_HANDLE_VALUE != hComm)rn rn BOOL fWriteStat; rn OVERLAPPED WRITE_OS;rn CString m_addr;rn int ItemCount = m_list.GetItemCount();rnrn CriticalSection.Lock();rn for (int Count = 0;Count < ItemCount;Count++)rn rn //do sth; rn rn CriticalSection.Unlock();rn rn return 0;rnrnrnvoid CQAMDlg::OnClose() rnrn if(hThread_QAM)rn rn DWORD exitcode1;rn GetExitCodeThread(hThread_QAM,&exitcode1);rn if(0 != exitcode1)rn rn WaitForSingleObject(hThread_QAM,INFINITE); //现在也是无限等待了,不明白为什么啊...按理说它只会阻塞到我那边线程退出.rn CloseHandle(hThread_QAM);rn rn rn g_tip = "";rn CDialog::OnClose();rnrn
主线程阻塞、消息队列机制和图片下载
结合例子,讲解了主线程阻塞、消息队列机制和图片下载,相关知识
子线程如何不阻塞主线程
for t in thread_list: # t.setDaemon(True) t.start() t.join() 这样做很方便啊,想开多少个线程就开多少个线程 但是这种情况遇到子线程阻塞的话就会有问题,例如rabbitmq的消费者,启动之后,consumer是一直处于阻塞的状态的,创建多个consumer的话,上...
子线程同步,会不会阻塞主线程?
子线程同步,会不会阻塞主线程?
Looper.loop()为什么不会阻塞主线程?
今天看IntentService时看到了Thread的run方法如下: @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll()...
Android主线程阻塞处理及优化
一、前期基础知识储备 当一个应用程序启动之后,android系统会为这个应用程序创建一个主线程(Main Thread),它负责渲染视图,分发事件到响应监听器并执行,对界面进行轮询的监听。因此,一般也叫做“UI线程”(UI Thread)。 android系统不会给应用程序的多个元素组件建立多个线程来执行。一个视图(Activity)中的多个view组件运行在同一个UI线程当中。因此,多个view...
解决UI主线程阻塞原因
了解进程和线程的区别,在进行耗时操作遇到阻塞时,学会线程阻塞时的处理方法。 当线程阻塞超过5秒时,会遭到系统的提示解决阻塞的问题的方法:(1)创建一个新的进程 官方建议:不要阻塞UI进程; 不要在UI进程之外的其他线程中,对视图当中的组件进行设置。 //经典异常 Only the original thread that created a view hierarchy can
QT串口使用
1.前言 Qt5.0以上都是使用官方的串口库,简单几步操作就可以使用。 2.演示 //首先是pro文件加入官方串口库信息 QT += serialport //mainwindow.h里加入串口头文件 #include &amp;lt;QtSerialPort/QSerialPort&amp;gt; #include &amp;lt;QtSerialPort/QSerialPortInfo&amp;gt; ...
QT串口多线程使用
使用movetothread方式。 ySerialPort = new YSerialPort(); serialPortThread = new QThread(); ySerialPort-&gt;moveToThread(serialPortThread); serialPortThread-&gt;start(); connect(serialPortTh...
QT串口使用总结
总结一下使用Qt使用串口的重要的知识。Qt已经提供了串口的类 QSerialPort,看看QT的相关帮助文档很快就能开发出一个简单的串口应用。Qt的帮助文档很丰富,在这个过程中也看了很多的博文以及Qt的帮助文档,受益匪浅。因为参考的博文很多,我也只是大概瞟一眼大家的思路,大同小异,在此也就不列举出参考的博文的出处了。下面总结下几个重要的地方。 第一个就是查找串口,使用了一个foreach来查找电脑...
C#如何防止串口被监听
如题,我已经占用一个串口了,但是我知道有些工具是可以监听串口的收发的,有什么办法防止这些工具,不让它知道串口的收发呢?以达到保密作用。
qt 如何监听tableview数据被修改?
我说的修改是插入新行,修改数据,删除行,这些都算rn有专门的signal吗?我好像没有找到
QT写串口时调试报错,
Debug Assertion Failed!Program: F:\procedure\LIBS_GUI\LIBS_V3.0\x64\Debug\LIBS_V3.0.exeFile: f:\dd\vctools\crt\crtw32\misc\dbgdel.cppLine: 52Expression: _BLOCK_TYPE_IS_VALID(pHead-&amp;gt;nBlockUse)For in...
监听串口?????????????????
我想做一个监听串口的程序。但是又不想把串口的数据读走。各位给我提提建议。我该怎么做。。
计算机串口监听工具,监听串口数据
此工具为串口监听工具,可以辅助监听串口传送的数据。
Qt串口接收时的数据处理
void ComDialog::ReadMyCom() { //读取串口数据 QByteArray byte_data = myCom-&amp;gt;readAll(); // char buf[10]; //将读取到的数据进行转化 QString strDisplay;   if(m_isHexDisplay)//十六进...
监听串口
OnDeviceChange可以监听串口通信嘛 怎么监听串口呀
wcf 多用户登录时,被阻塞的问题
我做了一个简单的仓库程序,允许多个保管员登录,但是发现一个问题,当一个保管员查询数据库时需要等待过长的时间,其余的管理员登录时会卡住,所以我模拟了下面的操作,测试发现WCF貌似不支持多线程.请看下面的简单模拟代码.rn服务器端,两个函数rnint foo1()rnrnThread.Sleep(100000);//模拟数据库查询的等待时间rnreturn 1;.//随便返回个数字rnrnint foo2()rnrnreturn 2;rnrnrn然后启动了两个客户端,rn第一个客户端调用那个有Sleep的函数,foo1();//此时服务器端sleep100秒.rn然后第二个客户端调用 foo2,这时发生了阻塞,第二个客户端一直等了100秒后,等第一个客户端的foo1函数执行完毕后才会得到结果 return2 rn这不是我想要的,用socket的时间我是每一个客户端给一个socket连接,并开启一个线程处理这个连接所有的请求数据,rn理论上说wcf不会这么不讲理吧,这样怎么能处理多用户的频繁访问,请问各位大神都是怎样解决的这种问题?
主线程在临界区被卡住!
我写的一个多线程读写串口程序rnReadThread用来监视串口接收到的数据 然后设置事件 让AnaThread开始执行解析 解析完毕后 设置全局变量SYS_STATUS=ST_NONErnAnaThread 是解析线程 waitforsignalobject,等到ReadThread设置事件后就去解析读出来的数据rnheartThread是心跳线程 没隔一秒发送一个心跳包,然后置SYS_STATUS=ST_WAIT_HEARTrn主线程是界面 当我点击一个按钮的时候就往串口发送一个数据包,并设置系统状态为ST_WAI_XXXrnrn为了防止心跳线程和主线程互相干扰,我设置了一个临界区 每个线程想发送数据的时候都要进入临界区EnterCriticalSection,然后while(SYS_STATUS!=ST_NONE); 一直等到系统状态时ST_NONE了再开始发送数据,发送完了设置系统状态,退出临界区。rnrn现在的问题是,我一运行界面就会卡死 而且CPU占用率非常高rn但是我就算给串口发送数据,readThread也收不到数据,不能把数据给解析线程,于是系统将就一直不是ST_NONE了rnrn请问这是怎么回事rnrn假如我的心跳线程正在发送数据,这时候我的主线程要发送数据了,应该就会在enterCriticalSection那里挂起了,等心跳线程发送完毕了就去等待系统状态为ST_NONE。 这时候我要是给串口发送数据了,应该就是readThread接到数据了然后去解析啊,解析完了系统状态就ST_NONE了啊 怎么会卡住呢?rnrn这是怎么回事 有没有什么好的方法解决呢??rnrn谢谢大家!rnrnrn
Qt 线程池的使用以及和主线程的消息同步
Qt中线程已经很早就出现了,关于多线程的使用的意义主要是为了减轻主线程的压力,提高用户的体验。 例如:在主线程中需要加载数据库中的很多表格,那么就可以考虑把多表格的读取放到工作线程中去,可以多加载几个线程目的就是加快读取表格的速度。 通过线程池和QRunable实现多线程。 1.编写QRunable class LoadTableRunable : public QObject, ...
关于阻塞和select的问题
1.怎么判断一个socket是不是设置成了非阻塞?rn2.可不可以select一个阻塞的socket?rn最好能随便说两句原因,谢过
如果select函数阻塞了
[size=12px]如题,如果select函数阻塞了,可能存在哪些原因? 又该如何解决?rnrn示例代码如下:[/size]rn[code=C/C++]rnint funtion(int sockfd)rnrn while(1)rn rn FD_ZERO(&r_set); // 假设 r_set 和下面的 ret 在程序外已经声明过了rn FD_SET(sockfd, &r_set);rn rn // 如果程序一直阻塞在下面的select处,可能是什么原因造成一直等不到准备就绪的描述符?rn ret = select(sockfd + 1, &r_set, NULL, NULL, NULL);rn if (ret == -1) rn perror("select");rn break;rn else if (ret == 0) rn printmsg("timeout... ");rn continue;rn rnrn[/code]
select()的阻塞机制
众所周知,当select 的 timeval参数设置成 NULL时,文件描述符集里 的描述符没有“风吹草动”的时候,select会一直阻塞的。 当他阻塞发生在什么时候呢,例如有一个while(1)循环: 当有一个客户端连接连接进来的时候,毫无疑问执行 FD_ISSET 下的语句,但奇怪的是,他打印完 buf2 之后,就阻塞了,奇怪,按理说不是应该会打印“111”, 再执行 FD_ZE
select与阻塞/非阻塞IO
目录 1、引言(select应用场景) 2、select意义 3、select 说明 4、 select使用例子 5、浅谈select阻塞机制 1、引言(select应用场景) 很多人把【阻塞/非阻塞socket】和select联系在一起,需要指明select函数与【阻塞/非阻塞socket】没有半毛钱的关系。select函数本身是阻塞的(与socket是否阻塞并没有关系), 直到:...
select没阻塞?
我超时设置的两秒,但是一点等待都没有就直接过去了,为什么?rn客户端 使用 select 的时候!
Select会不会阻塞
环境:HP-UX hp12161 B.11.31 U ia64 0546304299rnTCP客户端连接,connect成功,发送数据没有判断是否成功rn用select检测接收数据,超时时间设置500srn代码:rn[code=C/C++]struct timeval tm;rn tm.tv_sec = m_iHeartBeat; //recv package timeout, default value 5s.rn tm.tv_usec = 0;rnrn int32 iRet;rn fd_set read_set;rn FD_ZERO(&read_set);rn FD_SET(m_iSockFd, &read_set);rn iRet=::select(m_iSockFd+1, &read_set, NULL, NULL, &tm);rn[/code]rn用gdb64跟踪,发现一直阻塞在select函数,时间大概10小时rn今天上午把TCP监听端口的程序(就是对应的服务器端)关掉,这个函数才返回rnrn请教各位大侠,有没有什么情况会使select函数阻塞?
C:串口 select函数使用
接收缓存区: /* 接收长度 */ int recv_len; /* 接收缓存区 */ char recv_buf[MAX_RECV_BUF]; 串口接收函数: void Uart1::RecvSerial(int fd) { fd_set fds; struct timeval timeout={1,0}; //select等待1秒,1秒轮询,要非阻塞就置0 int se...
c语言 串口使用select
开始运行rn[img=https://img-bbs.csdn.net/upload/201703/23/1490266698_434862.jpg][/img]rnrn有串口输入后,不断执行printf函数rn[img=https://img-bbs.csdn.net/upload/201703/23/1490266757_638968.jpg][/img]rnrn哪里有问题rnrn[code=c]#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrnint fd_se;rnfd_set readfs;rnrnint set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)rnrn struct termios newtio,oldtio;rn if ( tcgetattr( fd,&oldtio) != 0)rn rn perror("SetupSerial 1");rn return -1;rn rn bzero( &newtio, sizeof( newtio ) );rn newtio.c_cflag |= CLOCAL | CREAD;rn newtio.c_cflag &= ~CSIZE;rnrn switch( nBits )rn rn case 7:rn newtio.c_cflag |= CS7;rn break;rn case 8:rn newtio.c_cflag |= CS8;rn break;rn rnrn switch( nEvent )rn rn case 'O': rn newtio.c_cflag |= PARENB;rn newtio.c_cflag |= PARODD;rn newtio.c_iflag |= (INPCK | ISTRIP);rn break;rn case 'E': rn newtio.c_iflag |= (INPCK | ISTRIP);rn newtio.c_cflag |= PARENB;rn newtio.c_cflag &= ~PARODD;rn break;rn case 'N': rn newtio.c_cflag &= ~PARENB;rn break;rn rnrnswitch( nSpeed )rn rn case 2400:rn cfsetispeed(&newtio, B2400);rn cfsetospeed(&newtio, B2400);rn break;rn case 4800:rn cfsetispeed(&newtio, B4800);rn cfsetospeed(&newtio, B4800);rn break;rn case 9600:rn cfsetispeed(&newtio, B9600);rn cfsetospeed(&newtio, B9600);rn break;rn case 38400:rn cfsetispeed(&newtio, B38400);rn cfsetospeed(&newtio, B38400);rn break;rn case 115200:rn cfsetispeed(&newtio, B115200);rn cfsetospeed(&newtio, B115200);rn break;rn default:rn cfsetispeed(&newtio, B9600);rn cfsetospeed(&newtio, B9600);rn break;rn rn if( nStop == 1 )rn rn newtio.c_cflag &= ~CSTOPB;rn rn else if ( nStop == 2 )rn rn newtio.c_cflag |= CSTOPB;rn rn newtio.c_cc[VTIME] = 0;rn newtio.c_cc[VMIN] = 0;rn tcflush(fd,TCIFLUSH);rn if((tcsetattr(fd,TCSANOW,&newtio))!=0)rn rn perror("com set error");rn return -1;rn rn printf("set done!\n");rn return 0;rnrnrnint open_port(int i)rnrn char *dev[]="/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2","/dev/ttySAC3";rn long vdisable;rn int fd;rn fd = open( dev[i], O_RDWR|O_NOCTTY|O_NDELAY);rn if (-1 == fd)rn rn printf("Can't Open Serial Port %s\n",dev[i]);rn return(-1);rn rn elsern printf("Open Serial Port %s success!\n",dev[i]);rn if(fcntl(fd, F_SETFL, 0)<0)rn rn printf("fcntl failed!\n");rn exit(0);rn rn elsern printf("fcntl id is %d\n",fcntl(fd, F_SETFL,0));rn if(isatty(STDIN_FILENO)==0)rn rn printf("standard input is not a terminal device\n");rn exit(0);rn rn elsern printf("This is a terminal device\n");rn return fd;rnrnrnvoid *serial_function(void *args)rnrn rn rn rn while(1)rn rn FD_SET(fd_se, &readfs); /* set testing for source 1 */rn select(fd_se+1, &readfs, NULL, NULL, NULL);rn rn if (FD_ISSET(fd_se,&readfs))rn rn printf("serial_function is running\n");rn rn rn rn close(fd_se);rnrnrnint main(void)rnrn int i;rn if((fd_se=open_port(1))<0)rn rn perror("open_port error");rn return;rn rn if((i=set_opt(fd_se,38400,8,'N',1))<0)rn rn perror("set_opt error");rn return;rn rnrn pthread_t thread1;rn if(pthread_create(&thread1, NULL, serial_function, NULL) != 0)rn rn perror("Thread create failed!");rn exit(EXIT_FAILURE);rn rn while(1)rn rn sleep(1);rn rn return;rn[/code]
QT串口阻塞方式使用,关闭时怎么使其退出waitForReadyRead(-1)
在编程中,我对QT串口采用了阻塞的方式,开了一个子线程专门读取串口的数据,这样的话,有数据就读没有数据就睡眠的方式。rn但是,却发现在关闭串口后,串口仍然在等待数据,子线程仍然睡在waitForReadyRead(-1)这里。rn怎么样做,才能在需要关闭串口的时候,让waitForReadyRead(-1)退出?rnrn
Go语言技巧:使用select{}阻塞main函数
很多时候我们需要让main函数不退出,让它在后台一直执行,例如:func main() { for i := 0; i < 20; i++ { //启动20个协程处理消息队列中的消息 c := consumer.New() go c.Start() } select {} // 阻塞 }可能大多数人想到阻塞的方法是用channel,当然都是可以
回射服务器-select的使用 01 (阻塞)
1. 经典“入门级”问题:IO 多路复用是什么意思? 在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流. 发明它的原因,是尽量多的提高服务器的吞吐能力。 是不是听起来好拗口,看个图就懂了.(其实就是一个时分复用)    在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流 那么,“一个请...
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview