对于一个串口的操作(比如设置电视屏的声音,亮度,关开等)最好不要放到多个线程里去操作,应该放到一个子线程里,我用时是写了类,把类再moveToThread放到一个QThread里
class SetScreenSerialport : public QObject
//class SetScreenBrightnessSerialport : public QThread
{
Q_OBJECT
public:
explicit SetScreenSerialport(LCDDispatch*lcd = NULL,QObject *parent = 0);
~SetScreenSerialport();
QSerialPort *serialport;
,使用串口时就加上QMutex锁住,用完关掉串口再解锁,且最好不要用readyRead信号,而是直接waitForReadyRead,再readAll,使用完解锁。如果用信号 ,有时没有信号触发,就
不能解锁了。
串口接收返回数据老是不完整,只能收到8个字节,使用以下方法解决:
if(serialport->write(data) == data.count()) //向串口写数据,等响应
{
serialport->waitForBytesWritten(500);//串口写入数据了,才会返回或者超时返回
QThread::msleep(100); //再等一会
if(serialport->waitForReadyRead()) //有数据了再读
{
readAllData(tmpBuf);
-----------------------------------------------------------------
void SetScreenSerialport::readAllData(QByteArray &data)
{
//反复读数据,读到通过校验为止
do
{
QByteArray t = serialport->readAll();
if(!t.isEmpty())
{
data = data.append(t);
QByteArray tmp = data.left(data.count() -1);
char lastByte = data.at(data.count() -1);
if(lastByte == getOneXor(tmp) && data.size() >= 6)//声音设置返回6最短
{
return;
}
}
QThread::msleep(500);
}
while(1);
}
----------------------
char getOneXor(QByteArray buf)//异或校验
{
char tmp = buf[0];
for(int i = 0; i < buf.count(); i++)
{
tmp = tmp ^ buf[i+1];
}
return tmp;
}

本文介绍了一种串口通信的优化方法,通过将串口操作置于单一线程中,并使用QMutex锁确保数据的安全访问。文章详细展示了如何通过循环读取直至接收到完整的数据包并进行异或校验来确保数据的完整性。
331

被折叠的 条评论
为什么被折叠?



