回复: 串口通信升级版
#16 [ningzb 01-23 10:52]
//windows下的串口通信的源码
//类的头文件
#pragma once
#include
#include
#include
class RevThread:
public QThread
{
Q_OBJECT
public:
RevThread(HANDLE hcom);
protected:
void run();
signals:
void ReceiveAByte(char dat);
private:
HANDLE hCom;
};
/////////////////////////////////////////////////////////
class ComRev :
public QObject
{
Q_OBJECT
public:
ComRev();
ComRev(BYTE port);
~ComRev();
enum BufLen{ REV_BUF_LEN=300};
enum ErrCode{ PORT_ERR=1,NOT_OPEN=2,OPEN_PORT_FAILED=3,PARA_ERR=4,ERR=5};
int OpenPort(int port=1);
int SetComPort(DWORD BaudRate,BYTE ByteSize,BYTE Parity,BYTE StopBits);
void ClosePort();
bool PortState();
BYTE GetPortNum();
public slots:
bool Send(const BYTE *buf,const DWORD len);
signals:
void ReceiveData(char dat);
private:
HANDLE hCom;
RevThread *tRev;
bool Opened;//打开标志
char PortNum;//当前所用的端口
};
#17 [ningzb 01-23 10:53]
//类的实现文件
#include "ComRev.h"
ComRev::ComRev()
{
//hCom=0;
Opened=FALSE;
}
ComRev::ComRev(BYTE port)
{
// hCom=HANDLE-1;
Opened=FALSE;
OpenPort(port);
}
ComRev::~ComRev()
{
ClosePort();
}
int ComRev::OpenPort(int port)
{
LPCWSTR PortStr;
HANDLE hPort;
if( (port>9)||(port==0) )
{
return -2;
}
switch(port)
{
case 1:
PortStr=TEXT("COM1");
break;
case 2:
PortStr=TEXT("COM2");
break;
case 3:
PortStr=TEXT("COM3");
break;
case 4:
PortStr=TEXT("COM4");
break;
case 5:
PortStr=TEXT("COM5");
break;
case 6:
PortStr=TEXT("COM6");
break;
case 7:
PortStr=TEXT("COM7");
break;
case 8:
PortStr=TEXT("COM8");
break;
case 9:
PortStr=TEXT("COM9");
break;
default:
return -2;
}
ClosePort();//先关闭以前打开的串口
hPort=CreateFile( PortStr, GENERIC_READ|GENERIC_WRITE, 0,NULL ,OPEN_EXISTING, 0,NULL);
if (hPort==(HANDLE)-1)
{
return -1;
}
else
{
& ..
#18 [ningzb 01-23 10:54]
刚开始学习,给准备学习Qt 的后来者一个参考
#19 [khb2000 02-05 11:56]
?//
#20 [yingruxue 07-24 23:44]
兄弟,你也太搞啦。一个串口通信就200,而且还不知道有没有bug呢。
我这里有个计算1+1=2的,按照你的算法,看来能卖2000啦,嘿嘿。
我也提供个串口通信的把,几行而已。
io_serviceisvr_;
serial_port port_;
port_.open("COM3");
port_.set_option(serial_port_base::baud_rate(4800));
port_.set_option(serial_port_base::character_size(8));
port_.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one));
port_.set_option(serial_port_base::flow_control(serial_port_base::flow_control::none));
port_.set_option(serial_port_base::parity(serial_port_base::parity::none));
while(true) {
char reply[128] = {0};
size_t reply_size = port_.read_some(boost::asio::buffer(reply));
doAppend(string(reply,reply_size));
Sleep(100);
}
用的boost::asio, 是跨各种平台的,比你的强大把。不要写几行代码就牛的不行了,成了井底之蛙。