// myMdbs.cpp: implementation of the myMdbs class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "myMdbs.h"
#include <stdio.h>
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
myMdbs::myMdbs()
{
::CoInitialize(NULL);
}
myMdbs::~myMdbs()
{
::CoUninitialize();
}
bool myMdbs::openPort(HANDLE &hComDev, UINT portnr, UINT baud, char parity, UINT databits, UINT stopsbits)
{
m_port = portnr, m_baud = baud, m_parity = parity, m_databits= databits, m_stopsbits = stopsbits;
return openPort(hComDev);
}
//初始化com端口 HANDLE
//tPort[10];
BOOL myMdbs::openPort(HANDLE &hComDev)//UINT port, UINT baud, char parity, UINT databits, UINT stopsbits)
{
const char tPort[]={'C', 'O', 'M', m_port+'0', 0};
//打开COM1
if(hComDev != NULL && hComDev != INVALID_HANDLE_VALUE)
return true;
if((hComDev=CreateFile(tPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
OPEN_EXISTING, //同步方式0 异步 FILE_FLAG_OVERLAPPED 0ld FILE_ATTRIBUTE_NORMAL OPEN_EXISTING设备必须存在,否则创建失败
NULL))==INVALID_HANDLE_VALUE)
return FALSE;
//设置超时控制
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 50;
SetCommTimeouts(hComDev,&timeouts);
//设置接收缓冲区和输出缓冲区的大小
// SetupComm(hComDev,32,8);
//获取缺省的DCB结构的值
// strSet.form("baud=%d parity=%c data=%d stop=%d",baud, parity, databits, stopsbits);
/** 临时变量,将制定参数转化为字符串形式,以构造DCB结构 */
DCB dcb;
char szDCBparam[50];
sprintf_s(szDCBparam, "baud=%d parity=%c data=%d stop=%d", m_baud, m_parity, m_databits, m_stopsbits);
bool bSuccess = GetCommState(hComDev, &dcb) && BuildCommDCB(szDCBparam, &dcb);
if(bSuccess)
{
//设置串行设备控制参数
if (!SetCommState(hComDev, &dcb))// && !SetCommMask(hComDev, EV_RXCHAR))
{
return false;
}
PurgeComm(hComDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); //清空缓冲区
}else
{
CloseHandle(hComDev);
hComDev = INVALID_HANDLE_VALUE;
return FALSE;
}
bOpen = true;
return true;
}
//发送命令
BOOL myMdbs::sendMsg(HANDLE &hComDev, LPCSTR strMsg)
{ //发送数据长度
LPSTR Buff = NULL;
int lenth = strlen(strMsg);
DWORD BytesSent;
if(!WriteFile(hComDev, // Handle to COMM Port
strMsg, // Pointer to message buffer in calling finction
lenth, // Length of message to send
&BytesSent, // Where to store the number of bytes sent
NULL)) // Overlapped structure */
{
int b = GetLastError(); //87 格式不符合设备接收协议 // 6是非法句柄
return false;
}
return true;
}
//发送命令
BOOL myMdbs::sendMsg_ASC(HANDLE &hComDev, LPCSTR strMsg)
{ //发送数据长度
bool send = false;
char* ASCdata =(char*)malloc(strlen(strMsg)/2);
int lenth = Str2Hex(strMsg,ASCdata);
strMsg = ASCdata;
DWORD BytesSent;
if( WriteFile(hComDev, // Handle to COMM Port
ASCdata, // Pointer to message buffer in calling finction
lenth, // Length of message to send
&BytesSent, // Where to store the number of bytes sent
NULL)) // Overlapped structure */
{
send = true;
}
free(ASCdata);
return send;
}
BOOL myMdbs::sendMsg(HANDLE &hComDev, char strMsg)
{ //发送数据长度
int lenth = 1;
DWORD BytesSent;
COMSTAT ComStat;
DWORD ComError = 0;
ClearCommError(hComDev, &ComError, &ComStat);
if(!WriteFile(hComDev, // Handle to COMM Port
&strMsg, // Pointer to message buffer in calling finction
lenth, // Length of message to send
&BytesSent, // Where to store the number of bytes sent
NULL)) // Overlapped structure */
{
int b = GetLastError(); //87 格式不符合设备接收协议
b ++;
return false;
}
return true;
}
//获取结果
BOOL myMdbs::getMsg(HANDLE &hComDev, LPSTR rstBuff, UINT &rstLength) //成功有内容返回 1 无内容返回 0
{
rstLength = 0;
DWORD BytesRead = 0;
COMSTAT ComStat;
DWORD ComError = 0;
ClearCommBreak(hComDev);
int step = 0;
do //循环读取两次 确保能够读到数据 BytesRead == 0
{
ClearCommError(hComDev, &ComError, &ComStat);
bool rst = ReadFile(hComDev, // Handle to COMM port
rstBuff, // RX Buffer Pointer
ComStat.cbInQue, // Read byte length
&BytesRead, // Stores number of bytes read
NULL);
if(!rst)
{
int b = GetLastError(); //87 格式不符合设备接收协议
Sleep(200); //没有数据先暂停0.5秒再重复接收 确保能够读到数据
}else
break;
}while(step++ <2);
if(BytesRead != 0)
{
rstLength = BytesRead;
rstBuff[rstLength] = 0;
// PurgeComm(hComDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); //清空缓冲区
return true;
}
return false;
}
BOOL myMdbs::closePort(HANDLE &hComDev) //关闭串口句柄
{
if(bOpen && hComDev != 0x00)
{
bOpen = false;
CloseHandle(hComDev);
}
hComDev = NULL;
return true;
}
//额外功能 字符串转ASC
char myMdbs::HexChar(char c)
{
if((c>='0')&&(c<='9'))
return c-0x30;
else if((c>='A')&&(c<='F'))
return c-'A'+10;
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else
return 0x10;
}
int myMdbs::Str2Hex(LPCSTR str, char* data)
{
int t,t1;
int rlen=0,len=strlen(str);
for(int i=0;i<len;)
{
char l,h=str[i];
if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))
break;
else
t=t*16+t1;
i++;
data[rlen]=(char)t;
rlen++;
}
return rlen;
}
bool myMdbs::EventReadMsg(HANDLE &hComDev, LPSTR rstBuff, int rstBuffSize) //wait com write event
{
OVERLAPPED ov = {0, 0, 0, 0, NULL};
DWORD nRead;
ReadFile(hComDev, rstBuff, rstBuffSize, &nRead, &ov);
WaitForSingleObject(hComDev, INFINITE);
GetOverlappedResult(hComDev, &ov, &nRead, false);
return true;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
myModbus.rar (2个子文件)
myMdbs.cpp 6KB
myMdbs.h 1KB
共 2 条
- 1
资源评论
宇文仲竹
- 粉丝: 323
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 清明节班会课课件重置版更新
- mqtt客户端,适合初学者参考,使用的是mqttnet三方包
- 戴尔 latitude 5400 chromebook
- 基于单片机数显照度计的设计
- 全文检索使用国产达梦数据库实现全文检索的详细说明和实践探索
- SRS-CentOS7-x86-64-5.0-r1.zip
- 全文检索使用ElasticSearch实现全文检索的详细说明和实践探索
- Python《基于TensorFlow的人脸识别(面部表情识别)卷积神经网络 》+源代码+文档说明
- Python《利用bert预训练的中文模型进行文本分类 数据集中文情感分析语料》+源代码+文档说明
- Keil MDK主题美化和代码美化
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功