使用QSerialport读取串口数据并处理
2017-07-18 21:06
246 查看
写了一个函数将ASCII转换为int
int DataToInt(char data)
{
int num = 0;
if(data>='0'&&data<='9')
num = data - 48;
if(data>='a'&&data<='f')
num = data - 87;
return num;
}
buff = new QByteArray;
void Serial::ReadData()
{
QByteArray arr = port->readAll();
QByteArray array =arr.toHex(); //转为16进制
buff->append(array);//一个串口传来的数据由两个16进制字符组成
if(buff->length()<16)
{
return;
}
QString buffdata;
buffdata.prepend(*buff);//QString中存放的是字符型
if(buffdata[0]=='e'&&buffdata[1]=='e'&&buffdata[2]=='c'&&buffdata[3]=='c')
{
if(buff->at(8)==97) //97=a filter zhouqixiaoxi
{
buff->remove(0,buff->size());
return;
}
if(buff->at(7)==53)//5 deascii shi 53 fliter motor2
{
buff->remove(0,buff->size());
return;
}
if(buff->at(7)==57)//9 deascii shi 57 filter moter
{
buff->remove(0,buff->size());
return;
}
if(buff->at(7)==97)//a deascii shi 97 filter shake
{
buff->remove(0,buff->size());
return;
}
emit this->diliverSerial(array);
int NodeSeq=buff->at(5)-48;
int NodeID=buff->at(7)-48;
int Command=buff->at(9)-48;
qDebug()<<NodeSeq;
qDebug()<<NodeID;
qDebug()<<Command;
if(NodeID==9)
{
buff->remove(0,buff->size());
return;
}
if(NodeID==3) //tempAndhum
{
float temph = DataToInt(buff->at(10))*16.0+DataToInt(buff->at(11));
float templ = DataToInt(buff->at(12))*16+DataToInt(buff->at(13));
float temp=((temph)*256+(templ))*0.01;
QString Datatemp = QString("%1").arg(temp);
float humh = DataToInt(buff->at(14))*16+DataToInt(buff->at(15));
float huml = DataToInt(buff->at(16))*16+DataToInt(buff->at(17));
float humi=((humh)*256+(huml))*0.01;
QString Datahumi = QString("%1").arg(humi);
/*
float temph = (buff->at(10)-48)*16+(buff->at(11)-48);
float templ = (buff->at(12)-48)*16+(buff->at(13)-48);
float temp=((temph)*256+(templ))*0.01-100;
QString Datatemp = QString("%1").arg(temp);
float humh = (buff->at(14)-48)*16+(buff->at(15)-48);
float huml = (buff->at(16)-48)*16+(buff->at(17)-48);
float humi=((humh)*256+(huml))*0.01;
QString Datahumi = QString("%1").arg(humi);
*/
emit this->diliverTemp(Datatemp);
emit this->diliverHumi(Datahumi);
QString DatatempAndhumi=Datatemp+","+Datahumi;
SensorInfo *info =new SensorInfo(NodeSeq,NodeID,Command,DatatempAndhumi); // ba data zhuang string
CreateJson(info);
buff->remove(0,buff->size());
}
if(NodeID==4) //shake
{
float shake = (buff->at(11)-48);
QString Datashake="no alarm";
if(shake==1)
{
Datashake = "1";
//ui->textEdit_smk->setText("alarm");****************
}
else{
Datashake = "0";
//ui->textEdit_smk->setText("no alarm");*************
}
emit this->diliverSmk(Datashake);
//QByteArray ByteData=Data.toUtf8();
SensorInfo *info =new SensorInfo(NodeSeq,NodeID,Command,Datashake); // ba data zhuang string
//qDebug("Temprature From Serial ---------"+ByteData);
//emit DiliverSerial(ByteData);
CreateJson(info);
buff->remove(0,buff->size());
}
}
}
void Serial::CreateJson(SensorInfo *info)
{
QJsonObject obj;
obj.insert("NodeSep",info->getSeq());
obj.insert("NodeID",info->getID());
obj.insert("Command",info->getCmd());
obj.insert("Data",info->getData());
QJsonDocument doc;
doc.setObject(obj);
QByteArray arry = doc.toJson(); // zhuancheng JSON
//qDebug(arry);
emit this->SendData(arry);
}
int DataToInt(char data)
{
int num = 0;
if(data>='0'&&data<='9')
num = data - 48;
if(data>='a'&&data<='f')
num = data - 87;
return num;
}
buff = new QByteArray;
void Serial::ReadData()
{
QByteArray arr = port->readAll();
QByteArray array =arr.toHex(); //转为16进制
buff->append(array);//一个串口传来的数据由两个16进制字符组成
if(buff->length()<16)
{
return;
}
QString buffdata;
buffdata.prepend(*buff);//QString中存放的是字符型
if(buffdata[0]=='e'&&buffdata[1]=='e'&&buffdata[2]=='c'&&buffdata[3]=='c')
{
if(buff->at(8)==97) //97=a filter zhouqixiaoxi
{
buff->remove(0,buff->size());
return;
}
if(buff->at(7)==53)//5 deascii shi 53 fliter motor2
{
buff->remove(0,buff->size());
return;
}
if(buff->at(7)==57)//9 deascii shi 57 filter moter
{
buff->remove(0,buff->size());
return;
}
if(buff->at(7)==97)//a deascii shi 97 filter shake
{
buff->remove(0,buff->size());
return;
}
emit this->diliverSerial(array);
int NodeSeq=buff->at(5)-48;
int NodeID=buff->at(7)-48;
int Command=buff->at(9)-48;
qDebug()<<NodeSeq;
qDebug()<<NodeID;
qDebug()<<Command;
if(NodeID==9)
{
buff->remove(0,buff->size());
return;
}
if(NodeID==3) //tempAndhum
{
float temph = DataToInt(buff->at(10))*16.0+DataToInt(buff->at(11));
float templ = DataToInt(buff->at(12))*16+DataToInt(buff->at(13));
float temp=((temph)*256+(templ))*0.01;
QString Datatemp = QString("%1").arg(temp);
float humh = DataToInt(buff->at(14))*16+DataToInt(buff->at(15));
float huml = DataToInt(buff->at(16))*16+DataToInt(buff->at(17));
float humi=((humh)*256+(huml))*0.01;
QString Datahumi = QString("%1").arg(humi);
/*
float temph = (buff->at(10)-48)*16+(buff->at(11)-48);
float templ = (buff->at(12)-48)*16+(buff->at(13)-48);
float temp=((temph)*256+(templ))*0.01-100;
QString Datatemp = QString("%1").arg(temp);
float humh = (buff->at(14)-48)*16+(buff->at(15)-48);
float huml = (buff->at(16)-48)*16+(buff->at(17)-48);
float humi=((humh)*256+(huml))*0.01;
QString Datahumi = QString("%1").arg(humi);
*/
emit this->diliverTemp(Datatemp);
emit this->diliverHumi(Datahumi);
QString DatatempAndhumi=Datatemp+","+Datahumi;
SensorInfo *info =new SensorInfo(NodeSeq,NodeID,Command,DatatempAndhumi); // ba data zhuang string
CreateJson(info);
buff->remove(0,buff->size());
}
if(NodeID==4) //shake
{
float shake = (buff->at(11)-48);
QString Datashake="no alarm";
if(shake==1)
{
Datashake = "1";
//ui->textEdit_smk->setText("alarm");****************
}
else{
Datashake = "0";
//ui->textEdit_smk->setText("no alarm");*************
}
emit this->diliverSmk(Datashake);
//QByteArray ByteData=Data.toUtf8();
SensorInfo *info =new SensorInfo(NodeSeq,NodeID,Command,Datashake); // ba data zhuang string
//qDebug("Temprature From Serial ---------"+ByteData);
//emit DiliverSerial(ByteData);
CreateJson(info);
buff->remove(0,buff->size());
}
}
}
void Serial::CreateJson(SensorInfo *info)
{
QJsonObject obj;
obj.insert("NodeSep",info->getSeq());
obj.insert("NodeID",info->getID());
obj.insert("Command",info->getCmd());
obj.insert("Data",info->getData());
QJsonDocument doc;
doc.setObject(obj);
QByteArray arry = doc.toJson(); // zhuancheng JSON
//qDebug(arry);
emit this->SendData(arry);
}
相关文章推荐
- SerialPort如何读取串口数据并显示在TextBox上,多线程委托
- SerialPort如何读取串口数据并显示在TextBox上,多线程委托
- SerialPort如何读取串口数据并显示在TextBox上,多线程委托
- C#SerialPort如何读取串口数据并显示在TextBox上
- 使用.net的SerialPort串口监控控件接收串口数据
- SerialPort 同步和异步数据读取
- 使用getJSON方法读取json文件数据并处理
- 使用Java程序一次分段读取所有数据(如海量数据)并计数处理
- CSerialport用于多串口烧录MCU时丢失数据的分析与解决办法
- C#serial Port串口处理~
- C++ boost::asio::serial_port 串口通信类 使用 封装 [大三四八九月实习]
- 使用Python与openpyxl进行表格处理(一)——读取数据
- SerialPort同步和异步数据读取(二)
- c#中serialPort1_DataReceived串口接收事件处理
- C++ boost::asio::serial_port 串口通信类 使用 封装
- SerialPort Read读取数据出问题
- SerialPort同步和异步数据读取(二)(
- [收藏]使用VMWare串口连接Windbg 官方文档说明 Examples: Debugging over a Virtual Serial Port
- Qt5下使用QtSerialPort对串口读写
- [收藏]使用VMWare串口连接Windbg 官方文档说明 Examples: Debugging over a Virtual Serial Port