VS2017+CnComm串口通讯

VS2017+CnComm串口通讯

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信