2023年6月22日发(作者:)
VS2017+CnComm串⼝通讯 CnComm开发库是⼀位国产的⼤⽜做的,封装得很不错,使⽤很简单。⼤⽜的博客地址: 最新的库: 其实也没啥必要说怎么开发,因为⾥⾯有个很好的demo,其实就是完完全全是⼀个串⼝助⼿的源代码,但是是⽤VC6.0开发的,如果你⽤VS2010编译,你也可以编译出来,但是如果⽤VS2017编译,就⼀⼤堆错误了。这篇⽂章主要以最简单的⽅式去说⼀下怎么⽤,⼀般来说,串⼝通信都是需要关联⼀个窗⼝,这次我就不关联窗⼝,改为关联线程,也就是说在独⽴的线程⾥⾯去接收和发送信息。 在说之前要给⼤家介绍⼀个⾮常有⽤的串⼝辅助⼯具:Virtual Serial Port Driver(VSPD),⼀看英⽂就知道是个串⼝模拟⼯具,利⽤这个⼯具就可以不需要其它硬件去跟电脑通信,只需要电脑跟⾃⼰通信,⾄于怎么使⽤,不在本⽂章介绍了,找度娘帮忙吧~~~ 第⼀步:新建⼀个SerialThread类,该类继承CWinThread[cpp]
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
#pragma once
#define WM_COM_THREAD_START WM_USER + 8
// SerialThread
#include"CnComm.h"
class SerialThread : public CWinThread
{
DECLARE_DYNCREATE(SerialThread)
protected:
SerialThread(); // 动态创建所使⽤的受保护的构造函数
virtual ~SerialThread();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
void CloseSerialPort(); //关闭串⼝
void OpenSerialPort();//打开串⼝
void SendDatas(CString msg);//发送数据
afx_msg void OnReceive(WPARAM, LPARAM); //接收数据
private:
CnComm Com;
int Ascii2Hex(char* ascii, char* hex); //ascii转⼗六进制
int Hex2Ascii(char* hex, char* ascii); //⼗六进制转ascii
protected:
DECLARE_MESSAGE_MAP()
};
第⼆步当然是要定义各种函数:[cpp]
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// : 实现⽂件
//
#include "stdafx.h"
#include "SerialDemo.h"
#include "SerialThread.h"
#include
using namespace std;
// SerialThread
IMPLEMENT_DYNCREATE(SerialThread, CWinThread)
SerialThread::SerialThread()
{
}
SerialThread::~SerialThread()
{
}
BOOL SerialThread::InitInstance()
{ 24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
// TODO: 在此执⾏任意逐线程初始化
ifyThreadId(m_nThreadID);
ion(ion() | CnComm::EN_RX_BUFFER);
return TRUE;
}
int SerialThread::ExitInstance()
{
// TODO: 在此执⾏任意逐线程清理
HANDLE hp = m_hThread;
if (()) ();
if (hp)
{
if (WaitForSingleObject(hp, 1) != WAIT_OBJECT_0)
{
TerminateThread(hp, 0);
}
CloseHandle(hp);
}
return CWinThread::ExitInstance();
}
void SerialThread::CloseSerialPort()
{
();
cout << "Close Successfully!" << endl;
}
void SerialThread::OpenSerialPort()
{
if (()) return;
bool open = (8, _T("COM1"), 9600);
if (open)
{
cout << "Open Successfully!" << endl;
}
else
{
cout << "Open Failed!" << endl;
HANDLE hp = m_hThread;
if (hp)
{
if (WaitForSingleObject(hp, 1) != WAIT_OBJECT_0)
{
TerminateThread(hp, 0);
}
CloseHandle(hp);
}
}
}
void SerialThread::SendDatas(CString msg)
{
char* buffer = new char[gth() * 2 + 1];
#ifdef UNICODE
int len = wcstombs(buffer, (LPCTSTR)msg, gth());
buffer[len] = 0;
#else
strcpy(buffer, (LPCTSTR)msg);
int len = gth();
#endif
//! 重叠模式下或者缓冲区模式下 可以不检查输出返回值,并直接输出
if (lappedMode() || fferMode())
(buffer);
else
{//! 阻塞⾮缓冲区模式 必须检查返回值,确保数据完全发送出
for (int i = 0; i < len; i++)
i += (buffer + i, len - i);
}
delete[] buffer;
}
void SerialThread::OnReceive(WPARAM wParam, LPARAM lParam)
{
if (wParam == t()) 103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
{
do {
char buffer[1024];
int len = (buffer, 1023);
buffer[len] = _T('0');
cout << buffer << endl;
} while (fferMode() && ().SafeSize());
}
}
int SerialThread::Ascii2Hex(char* ascii, char* hex)
{
int i, len = strlen(ascii);
char chHex[] = "ABCDEF";
for (i = 0; i < len; i++)
{
hex[i * 3] = chHex[((BYTE)ascii[i]) >> 4];
hex[i * 3 + 1] = chHex[((BYTE)ascii[i]) & 0xf];
hex[i * 3 + 2] = ' ';
}
hex[len * 3] = '0';
return len * 3;
}
int SerialThread::Hex2Ascii(char* hex, char* ascii)
{
int len = strlen(hex), tlen, i, cnt;
for (i = 0, cnt = 0, tlen = 0; i < len; i++)
{
char c = toupper(hex[i]);
if ((c >= '0'&& c <= '9') || (c >= 'A'&& c <= 'F'))
{
BYTE t = (c >= 'A') ? c - 'A' + 10 : c - '0';
if (cnt)
ascii[tlen++] += t, cnt = 0;
else
ascii[tlen] = t << 4, cnt = 1;
}
}
return tlen;
}
BEGIN_MESSAGE_MAP(SerialThread, CWinThread)
ON_THREAD_MESSAGE(ON_COM_RECEIVE, OnReceive) //消息映射
END_MESSAGE_MAP()
// SerialThread 消息处理程序
第三步:直接新建⼀个线程。 SerialThread*thread = (SerialThread*)AfxBeginThread(RUNTIME_CLASS(SerialThread)); 把上⾯的直接copy到你的⼯程就可以⽤了~~~
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687429774a9393.html
评论列表(0条)