3,245
社区成员
发帖
与我相关
我的任务
分享
int CHTDLPCard::OpenPort() //打开串口
{
CString strComm;
int die;
die = ::GetPrivateProfileInt("HARDWARE", "卡串口号", 0, ".\\card.ini");
strComm.Format("%s%d", "COM", die);
m_hCom = CreateFile(strComm,//COM1口
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
int a = GetLastError();
if (m_hCom == INVALID_HANDLE_VALUE)
{
AfxMessageBox("卡串口打开失败");
m_bOpen = FALSE;
return FALSE;
}
//else
//AfxMessageBox("打开串口成功");
SetCommMask(m_hCom, EV_RXCHAR);
//清干净输入、输出缓冲区
PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
SetupComm(m_hCom, 2048, 2048); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;//把间隔超时设为最大,把总超时设为0,将导致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier = 1;
TimeOuts.ReadTotalTimeoutConstant = 5;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 1;
TimeOuts.WriteTotalTimeoutConstant = 5;
SetCommTimeouts(m_hCom, &TimeOuts); //设置超时
GetCommState(m_hCom, &dcb);
dcb.BaudRate = m_nBaud; //波特率为9600
dcb.ByteSize = m_nDataBits; //每个字节有8位
dcb.Parity = m_nParity; //无奇偶校验位
dcb.StopBits = m_nStopBits; //停止位
SetCommState(m_hCom, &dcb);
m_bOpen = TRUE;
COMSTAT ComStat;
DWORD dwErrorFlags = 0;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
return 1;
}
int CHTDLPCard::SendData(HANDLE com /*串口号*/,
BYTE bFun /*功能码*/,
BYTE bDataLen /*数据长度*/,
BYTE* pbData /*数据*/) //发送数据,例如SendData(com, 0x01, 0, NULL)
{
//检查参数
if (bDataLen < 0)
return 0;
//总目标发送长度
int iTxLen = 0
+ 2 //字节头
+ 1 //功能码
+ 1 //字节长度
+ bDataLen //数据长度
+ 2 //校验
+ 2 //字节尾
+ 0;
//申请缓冲区
BYTE* pTxData = new BYTE[iTxLen];
//构造发送数据帧
int iOfst = 0;
pTxData[iOfst] = 0xC1; iOfst++;//字节头
pTxData[iOfst] = 0xC2; iOfst++;
pTxData[iOfst] = bFun; iOfst++;//功能码
pTxData[iOfst] = bDataLen + 2; /*数据位+两个校验位*/ iOfst++;//字节长度
memcpy(pTxData + iOfst, pbData, bDataLen); iOfst += bDataLen;//数据
{ //计算校验位
uint16_t checksum = getChecksum(pTxData, iOfst);
//ULONG uSumL = 0;//之前所有数据的累计和
//for (int n = 0; n < iOfst; n++) { uSumL += pTxData[n]; }
////(高16位+低16位)后取反
//WORD wSum = (WORD)(~(HIWORD(uSumL) + LOWORD(uSumL)));
#ifdef _BIG_ENDIAN //大端模式
pTxData[iOfst] = checksum >> 8; iOfst++;
pTxData[iOfst] = checksum; iOfst++;
//pTxData[iOfst] = HIBYTE(wSum); iOfst++;
//pTxData[iOfst] = LOBYTE(wSum); iOfst++;
#else //!_BIG_ENDIAN //小端模式
pTxData[iOfst] = checksum >> 8; iOfst++;
pTxData[iOfst] = checksum; iOfst++;
//pTxData[iOfst] = LOBYTE(wSum); iOfst++;
//pTxData[iOfst] = HIBYTE(wSum); iOfst++;
#endif
}
pTxData[iOfst] = 0x0A; iOfst++;//字节尾
pTxData[iOfst] = 0x0D; iOfst++;
//COMSTAT ComStat; //清理缓冲区
//DWORD dwErrorFlags;
//ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
//PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
//这里用串口等通讯接口发送数据
DWORD bytesWritten;
bool ret = WriteFile(com, pTxData, iOfst, &bytesWritten, 0);
//结束清理
delete[] pTxData;
if (ret)
return 1;
else
return 0;
}