如何向串口发送数据,并接收串口发来的数据
#include <stdio.h>
#include <iostream>
#include <afxwin.h>
#include <windows.h>
HANDLE hCom = NULL;//全局变量,串口句柄
class BP{
public:
void Set_Init_pressure_OnSend(void); //主机向血压板发送数据
void Set_Init_pressure_OnReceive(void); //血压板返回给主机数据
void Set_Init_pressure_OnClose(void); //关闭串口
private:
int str[100];
DWORD dwErrorFlags;
COMSTAT ComStat;
BOOL bWriteStat;
BOOL bReadStat;
};
//主机向血压板发送数据
void BP::Set_Init_pressure_OnSend(void)
{
int lpOutBuffer[11];
memset(lpOutBuffer, '\0', sizeof(int)*11); //把前五个字符先清零
lpOutBuffer[0] = 0x55; //发送缓冲区的第一个字节为3A
lpOutBuffer[1] = 0x12; //发送缓冲区的第二个字节为17
lpOutBuffer[2] = 0x01; //发送缓冲区的第三个字节为B4
lpOutBuffer[3] = 0x00; //发送缓冲区的第四个字节为00
lpOutBuffer[4] = 0x00; //发送缓冲区的第五个字节为F8
lpOutBuffer[5] = 0x00; //发送缓冲区的第五个字节为F8
lpOutBuffer[6] = 0x00; //发送缓冲区的第五个字节为F8
lpOutBuffer[7] = 0x00; //发送缓冲区的第五个字节为F8
lpOutBuffer[8] = 0x00; //发送缓冲区的第五个字节为F8
lpOutBuffer[9] = 0xAA; //发送缓冲区的第五个字节为F8
lpOutBuffer[10] = '\0'; //发送缓冲区的第五个字节为F8
printf("发送数据 : ");
for(int i=0; i<10; i++){
printf("%x ", lpOutBuffer[i]);
}
printf("\n");
//55 12 01 00 00 00 00 00 00 aa
DWORD dwBytesWrite = 11;
ClearCommError(hCom, &dwErrorFlags, &ComStat);//返回串口错误和报告(也可以查看缓冲区状态)
bWriteStat = WriteFile(hCom, lpOutBuffer, dwBytesWrite, &dwBytesWrite, NULL);
if(!bWriteStat)
{
printf("写串口失败!\n");
}
printf("写串口成功!\n");
printf("\n");
}
//血压板返回给主机数据
void BP::Set_Init_pressure_OnReceive(void)
{
memset(str, '\0', 100);
DWORD wCount = 100;
bReadStat = ReadFile(hCom, str, wCount, &wCount, NULL);
if(!bReadStat){
printf("读串口失败!");
}
printf("读串口成功!\n");
// m_disp = str;
// UpdateData(FALSE);
printf("接收数据 : %x \n", str);
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区
}
//关闭串口
void BP::Set_Init_pressure_OnClose(void){
CloseHandle(hCom);
}
int main(void)
{
BP bp;
//打开串口
if (hCom != NULL)
{
CloseHandle(hCom);
hCom = NULL;
}
hCom = CreateFile("COM4", //COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //设置产生方式
NULL, // 我们准备使用异步通信0, //同步方式
NULL);
if(hCom == (HANDLE)-1)
{
printf("打开COM失败!\n");
return FALSE;
}
printf("打开COM成功!\n");
//SetupComm设置串口输入输出缓冲区大小
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout = 100;
TimeOuts.ReadTotalTimeoutMultiplier = 100;
TimeOuts.ReadTotalTimeoutConstant = 100;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 1000;
TimeOuts.WriteTotalTimeoutConstant = 1000;
printf("定时器设置成功!\n");
SetCommTimeouts(hCom, &TimeOuts); //用COMMTIMEOUTS结构体某个内容设置超时
DCB dcb;
GetCommState(hCom,&dcb); //获取串口的初始配置(获得COM口的设备控制块,获得相关参数)
dcb.BaudRate = 9600; //波特率为9600
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb); //设置串口(设置COM口的设备控制块)
//PurgeComm清空缓冲区
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区中断所以写操作并立即返回,即使写操作还没有完成。
printf("端口设置成功!\n");
bp.Set_Init_pressure_OnSend(); //主机向血压板发送数据
bp.Set_Init_pressure_OnReceive(); //血压板返回给主机数据
bp.Set_Init_pressure_OnClose(); //关闭串口
return 0;
}