该例子是:《Visual C++实践与提高-串口通信与工程应用篇_第2版》书上给出的部分源码,
整理修改之后的演示代码:
借助 TC35模块可以,正常运行:
代码如下:
// seritalTK.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
HANDLE hCom;
DWORD ThreadProcWrite(LPVOID pParam);
DWORD ThreadProcRead(LPVOID pParam);
OVERLAPPED Wol={0};
OVERLAPPED Rol = {0};
HANDLE hThreadWrite;
HANDLE hThreadRead ;
HWND hWnd;
DWORD ThreadProcRead(LPVOID pParam)
{
BYTE myByte[20];
DWORD dwRes;
DWORD dwRead;
DWORD dwRet ;
BOOL bResult;
memset(myByte,0,sizeof(myByte));
Rol.hEvent = CreateEvent(NULL, //创建Rol的hEvent成员为无信号状态
TRUE,
FALSE,
NULL);
if (Rol.hEvent == NULL)
{
printf("hEvent is Empty\r\n");
return -1;
}
bResult = ReadFile(hCom, //串口句柄
&myByte, //存放读取数据
9, //要读取的字节数
NULL,
&Rol) ; //指向创建hCom时的Rol的指针
if(bResult){
printf("success read out A\r\n");
//在这里加入处理读取数据代码,数据存放在myByte数组中
}
dwRet =GetLastError() ;
if(!bResult &&(dwRet == ERROR_IO_PENDING)){
dwRes = WaitForSingleObject ( Rol.hEvent , 5000 ); //5秒超时
switch(dwRes)
{
case WAIT_OBJECT_0:
if (!GetOverlappedResult (hCom,
&Rol,
&dwRead, //实际读出的字节数
TRUE) ) //TRUE表示直到操作完成函数才返回
{
//操作失败,可以使用GetLastError()获取错误信息
}
else
{
//操作成功完成,数据读取存入myByte中
//这里加入处理数据的代码
printf("success read out dwRead = %d,%s\r\n",dwRead,myByte);
}
break;
case WAIT_TIMEOUT:
//读操作失败,原因是超时
printf("读操作失败,原因是超时\r\n");
break;
default:
//这里加入默认处理代码
break;
}
}
CloseHandle(Rol.hEvent);
return 0;
}
DWORD ThreadProcWrite(LPVOID pParam)
{
BYTE myByte[10] ="AT\r\n";
DWORD dwRes;
DWORD dwWrite;
BOOL bResult ;
Wol.Internal = 0; //设置OVERLAPPED结构Wol
Wol.InternalHigh = 0;
Wol.Offset = 0;
Wol.OffsetHigh = 0;
Wol.hEvent = CreateEvent ( NULL, //创建Wol的hEvent成员为无信号状态
TRUE,
FALSE,
NULL);
if (Wol.hEvent == NULL)
{
printf("hEvent 空");
return -1;
}
bResult = WriteFile (hCom, //串口句柄
&myByte, //存放待发送数据
4, //欲发送的字节数
NULL,
&Wol) ; //指向创建hCom时的Wol的指针
if(bResult)
{
printf("send success \r\n");
}
if(!bResult){
dwRes = WaitForSingleObject ( Wol.hEvent , 500 ); //5ms超时
switch(dwRes)
{
case WAIT_OBJECT_0:
if (!GetOverlappedResult (hCom,
&Wol,
&dwWrite,
TRUE) ) //TRUE表示直到操作完成函数才返回
{
//操作失败,可以使用GetLastError()获取错误信息
}
else
{
//发送数据成功
printf("send success dwWrite = %d \r\n",dwWrite);
//这里加入发送成功的处理代码
}
break;
case WAIT_TIMEOUT:
//读操作失败,原因是超时
break;
default:
//这里加入默认处理代码
break;
}
}
CloseHandle(Wol.hEvent);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
hCom = CreateFile(_T("COM6"),
GENERIC_READ |GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL |FILE_FLAG_OVERLAPPED,
NULL
);
if(hCom != INVALID_HANDLE_VALUE){
SetupComm(hCom,1024,512);
DCB myDCB;
GetCommState(hCom,&myDCB);
myDCB.BaudRate = CBR_9600; // 设置波特率9600
myDCB.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE
myDCB.fParity = FALSE; // 支持奇偶校验
myDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
myDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
myDCB.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control
myDCB.fDsrSensitivity = FALSE; // DSR sensitivity
myDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx
myDCB.fOutX = FALSE; // No XON/XOFF out flow control
myDCB.fInX = FALSE; // No XON/XOFF in flow control
myDCB.fErrorChar = FALSE; // Disable error replacement
myDCB.fNull = FALSE; // Disable null stripping
myDCB.fRtsControl = RTS_CONTROL_DISABLE; //No RTS flow control
myDCB.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写
myDCB.ByteSize = 8; // 数据位,范围:4-8
myDCB.Parity = NOPARITY; // 校验模式
myDCB.StopBits = 0; // 1位停止位
SetCommState(hCom,&myDCB);
}else{
printf("Open Serial Fail\r\n");
return 0 ;
}
DWORD dwReadThreadID;
DWORD dwReadParam;
hThreadRead = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProcRead,
&dwReadParam,
0,
&dwReadThreadID
);
if(hThreadRead == NULL){
printf("Create Read Thread Fail \r\n");
}
DWORD dwWriteThreadID;
DWORD dwWriteParam;
hThreadWrite = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProcWrite,
&dwWriteParam,
0,
&dwWriteThreadID
);
if(hThreadWrite == NULL){
printf("Create Write Thread Fail \r\n");
}
while(1){
Sleep(1000);
}
CloseHandle(hCom);
return 0;
}
运行结果:
send success dwWrite = 4
success read out dwRead = 9,AT
OK
BUS BOUND 监控:
需要进一步的改善。
20180606