吉时利2000与VC6.0建立通信,并读取电压值,所有代码加注释
时间: 2024-05-07 17:19:15 浏览: 175
对于吉时利2000与VC6.0建立通信并读取电压值,需要使用串口通信。下面是C++代码示例,其中包括了注释说明。
```c++
// 包含串口通信头文件
#include "afxwin.h"
// 定义串口通信类
class CSerialPort : public CObject
{
public:
// 构造函数
CSerialPort();
// 析构函数
virtual ~CSerialPort();
// 打开串口
BOOL Open(int nPort = 2, int nBaud = 9600, char parity = 'N', int nDatabits = 8, int nStopbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS, HWND hWnd = NULL);
// 关闭串口
void Close();
// 发送数据
BOOL WriteComm(const char* lpBuf, DWORD dwToWrite);
// 读取数据
int ReadComm(char* lpBuf, int nBufSize);
// 获取串口句柄
HANDLE GetCommHandle() const;
// 判断串口是否打开
BOOL IsOpened() const;
private:
// 串口句柄
HANDLE m_hComm;
// 串口是否打开
BOOL m_bOpened;
};
// 构造函数
CSerialPort::CSerialPort()
: m_hComm(INVALID_HANDLE_VALUE)
, m_bOpened(FALSE)
{
}
// 析构函数
CSerialPort::~CSerialPort()
{
Close();
}
// 打开串口
BOOL CSerialPort::Open(int nPort, int nBaud, char parity, int nDatabits, int nStopbits, DWORD dwCommEvents, HWND hWnd)
{
// 关闭串口
Close();
// 构造串口名称
CString strPort;
strPort.Format(_T("COM%d"), nPort);
// 打开串口
m_hComm = CreateFile(strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (m_hComm == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 配置串口
DCB dcb;
memset(&dcb, 0, sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
if (!GetCommState(m_hComm, &dcb))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
dcb.BaudRate = nBaud;
dcb.ByteSize = nDatabits;
dcb.Parity = parity;
dcb.StopBits = nStopbits;
if (!SetCommState(m_hComm, &dcb))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
// 设置串口事件
if (!SetCommMask(m_hComm, dwCommEvents))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
// 设置串口窗口句柄
if (hWnd != NULL)
{
if (!SetCommEventMask(m_hComm, dwCommEvents))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
if (!SetupComm(m_hComm, 4096, 4096))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
if (!SetCommTimeouts(m_hComm, NULL))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
if (!SetCommCallback(m_hComm, NULL, 0))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
if (!EscapeCommFunction(m_hComm, SETDTR))
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
}
// 串口打开成功
m_bOpened = TRUE;
return TRUE;
}
// 关闭串口
void CSerialPort::Close()
{
if (m_bOpened && m_hComm != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
m_bOpened = FALSE;
}
}
// 发送数据
BOOL CSerialPort::WriteComm(const char* lpBuf, DWORD dwToWrite)
{
if (!m_bOpened || m_hComm == INVALID_HANDLE_VALUE)
{
return FALSE;
}
DWORD dwWritten = 0;
if (!WriteFile(m_hComm, lpBuf, dwToWrite, &dwWritten, NULL))
{
return FALSE;
}
return TRUE;
}
// 读取数据
int CSerialPort::ReadComm(char* lpBuf, int nBufSize)
{
if (!m_bOpened || m_hComm == INVALID_HANDLE_VALUE)
{
return -1;
}
DWORD dwRead = 0;
if (!ReadFile(m_hComm, lpBuf, nBufSize, &dwRead, NULL))
{
return -1;
}
return dwRead;
}
// 获取串口句柄
HANDLE CSerialPort::GetCommHandle() const
{
return m_hComm;
}
// 判断串口是否打开
BOOL CSerialPort::IsOpened() const
{
return m_bOpened;
}
// 主函数
int main(int argc, char* argv[])
{
// 创建串口对象
CSerialPort serial;
// 打开串口
if (!serial.Open(1, 9600, 'N', 8, 1, EV_RXCHAR))
{
// 打开失败
return -1;
}
// 发送读取电压值的命令
serial.WriteComm("VOLT?\r\n", strlen("VOLT?\r\n"));
// 读取返回值
char buf[1024] = { 0 };
int nRead = serial.ReadComm(buf, 1024);
// 输出返回值
printf("Voltage: %s", buf);
// 关闭串口
serial.Close();
return 0;
}
```
以上代码示例中,打开串口的函数使用了默认参数,可以根据实际需求进行修改。其中,串口配置的参数需要与吉时利2000的参数匹配,才能正常通信。读取电压值的命令为 "VOLT?\r\n",读取返回值后需要进行解析。
阅读全文