16,472
社区成员
发帖
与我相关
我的任务
分享
hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
//COM1
//允许读写
// 0 独占方式
//OPEN_EXISTING打开而不是创建
//同步方式
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败");
return FALSE;
}
GetDlgItem(IDC_DISP)->SetWindowText(" 正在发送测试端口标志请等待……");
SetTimer(10,2000,NULL);
SetTimer(11,2000,NULL);
//GetDlgItem(IDC_DISP)->SetWindowText("端口已找到");
//在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。
//这需要通过一个DCB结构来进行。
//DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。
//在查询或配置串口的属性时,都要用DCB结构来作为缓冲区
//一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置
//要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口。
SetupComm(hCom,100,100);//输入缓冲区和输出缓冲区的大小都是100
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0;//读时间系数
TimeOuts.ReadTotalTimeoutConstant=0;//读时间常量
//在读一次输入缓冲区的内容后读操作就立刻返回
//而不管是否读入了要求的字符
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100; //总超时=时间系数*要求读/写的字符数+时间常量
TimeOuts.WriteTotalTimeoutConstant=500; //设置写超时以指定WriteComm成员函数中的
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY; //无奇偶校验
dcb.StopBits=TWOSTOPBITS; //2个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
void CMyDlg::OnSend()
{
//MessageWindow 提供发送和接受基于window的消息能力
//若要在程序中使用 MessageWindow,您需要创建一个从 MessageWindow 派生的类,
//并重写默认的 WndProc 行为来监视特定的窗口消息。可以使用 Message 类生成消息。
//可以只接收您使用 MessageWindow 生成的或由本机控件生成的基于 Windows 的消息。
// TODO: Add your control notification handler code here
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
char lpOutBuffer[7];
memset(lpOutBuffer,'\0',7);
lpOutBuffer[0]='\x11';
lpOutBuffer[1]='0';
lpOutBuffer[2]='0';
lpOutBuffer[3]='1';
lpOutBuffer[4]='0';
lpOutBuffer[5]='1';
lpOutBuffer[6]='\x03';
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,&m_osWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
}
}
}
void CMyDlg::OnReceive() //接收
{
// TODO: Add your control notification handler code here
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
COMSTAT ComStat;
DWORD dwErrorFlags;
char str[100];
memset(str,'\0',100);
DWORD dwBytesRead=100;//读取的字节数
BOOL bReadStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
bReadStat=ReadFile(hCom,str,
dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
}
}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}