Linux - 串口处理
一定注意 注意:conn.setTimeout(10); 否则默认设置为500ms读取数据一次
/*!
\fn void QextSerialBase::construct()
Common constructor function for setting up default port settings.
(115200 Baud, 8N1, Hardware flow control where supported, otherwise no flow control, and 0 ms timeout).
*/
void QextSerialBase::construct()
{
Settings.BaudRate=BAUD115200;
Settings.DataBits=DATA_8;
Settings.Parity=PAR_NONE;
Settings.StopBits=STOP_1;
Settings.FlowControl=FLOW_HARDWARE;
Settings.Timeout_Millisec=500;
mutex = new QMutex( QMutex::Recursive );
setOpenMode(QIODevice::NotOpen);
}
//setTimeout()作用是定时读取数据到缓冲区 setTimeout(ms)里面大小参数设置原则:越小越好,不过如果pc机一次性发送的数据比较庞大,应该增大参数大小
1.工程文件地址:
Posix_QextSerialPort:git@github.com:qextserialport/qextserialport.git
2.Linux-基本参考:
1初始化 Posix_QextSerialPort 类
//const QString & name ->表示所使用的USART号
Posix_QextSerialPort conn("/dev/ttyAMA3", QextSerialBase::Polling);
conn.open(QIODevice::ReadWrite);
conn.setBaudRate(BAUD9600);
conn.setDataBits(DATA_8);
conn.setParity(PAR_NONE);
conn.setStopBits(STOP_1);
conn.setFlowControl(FLOW_OFF);
conn.setTimeout(10); //-->一定初始化10ms 如果不设置会默认为500ms中断一次
2发送方法 直接使用即可
qint64 write(const char *data, qint64 len);
qint64 write(const char *data);
3接收方法
qint64 read(char *data, qint64 maxlen);
QByteArray read(qint64 maxlen);
QByteArray readAll();
qint64 readLine(char *data, qint64 maxlen);
QByteArray readLine(qint64 maxlen = 0);
PS: 经过测试,readAll()效率比较低,延时较大 conn.setTimeout(500);的情况下测试的
readAll()接收的情况,建议使用这种接收方式:
// 从串口获取数据
QByteArray temp;
int num1,num2;
num1 = num2 = 0;
do{
num1 = myCom->bytesAvailable(); //第一次查看串口缓冲区的数据
msleep(10);
num2 = myCom->bytesAvailable(); //第二次查看串口缓冲区的数据
msleep(10);
}while((num1 != num2) || (num1 <=0) || (num2 <= 0));
temp = myCom->readAll(); //读取串口缓冲区的所有数据给临时变量temp
自己使用的是read()单个字节接收方式
if(conn.bytesAvailable())
{
char utemp = 0x00;
while(conn.read(&utemp, 1))
{
buf.date[buf.wp % BUF_MAX] = utemp;
buf.wp++;
}
}
**PS: 建议创建一个结构体, 设置 读写指针来写入和读出数据缓冲区 **
typedef struct
{
int wp;
int rp;
quint8 date[BUF_MAX];
}ST_SR_DATE;
4QTimer发送和接收
//接收
time_rev = new QTimer();
time_rev->setInterval(30);
connect(time_rev,SIGNAL(timeout()),this,SLOT(read_serial_data()),Qt::DirectConnection);
time_rev->start();
//发送同理哦
创建一个QTimer进行定时器定时读取即可。
WARNNING
接收方法read()或者写入方法write()都不能一直运行;比如在一个线程中一直进行接收或者发送操作;这样会造成另一个方法阻塞,无法使用;(
绝对不能直接使用QTread线程一直查询的方式,会导致发送 write()方法阻塞)一定设置setTimeout(10);具体值的大小,根据自身测试使用;
virtual qint64 readData(char * data, qint64 maxSize); virtual qint64 writeData(const char * data, qint64 maxSize);
如何向使用上面的readData 和WriteData方法的话,需要将让他们从 posix_qextserialport.h 中的 protect 中移到 public 中声明,就可以使用了
待更新