com口通讯问题

s_hhm 2014-04-23 05:15:45
同步操作COM 先发送数据到COM1 然后再从COM读数据.无法读到.也不知道是没写入成功,还是读不出来?望高手指导!代码如下:
//打开并设置COM1
hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(hCom==(HANDLE)-1)
{
MessageBox("打开COM失败!");
}
else
{
MessageBox("打开COM口成功");
}

SetupComm(hCom,1024,1024);
COMMTIMEOUTS TimeOuts;
memset(&TimeOuts,0,sizeof(COMMTIMEOUTS));
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutConstant=0;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutConstant=0;
TimeOuts.WriteTotalTimeoutMultiplier=0;
SetCommTimeouts(hCom,&TimeOuts);
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=19200;//波特率为9600
dcb.ByteSize=8;//每个字节有8 位
dcb.Parity=NOPARITY;//无奇偶校验位
dcb.StopBits=TWOSTOPBITS;//两个停止位
if(!SetCommState(hCom,&dcb))
{
MessageBox("设置COM口失败");
}
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

void CCtrlDlg::OnReadCOM() //写入数据
{
char lpOutBuffer[100];
memset(lpOutBuffer,'\0',100);
DWORD dwBytesWrite=100;
lpOutBuffer[0]='z';
lpOutBuffer[1]='h';
lpOutBuffer[2]='a';
lpOutBuffer[3]='o';
lpOutBuffer[4]='5';
lpOutBuffer[5]='w';
lpOutBuffer[6]='e';
lpOutBuffer[7]='n';
lpOutBuffer[8]='5';
lpOutBuffer[9]='t';
lpOutBuffer[10]='a';
lpOutBuffer[11]='o';
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
OVERLAPPED m_osRead;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);
if(!bWriteStat)
{
MessageBox("写串口失败!");
}
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

}
void CCtrlDlg::OnWriteCOM() //读数据.这里既不报错但buffer一直为空.
{
char str[100];
memset(str,'\0',100);
DWORD wCount;
BOOL bReadStat;
OVERLAPPED m_osRead;
bReadStat=ReadFile(hCom,&str,10,&wCount,0);
if(!bReadStat)
{
MessageBox("读串口失败!");

}
PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
MessageBox(str);
// CloseHandle(hCom);
};
...全文
159 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
b971049 2014-04-26
  • 打赏
  • 举报
回复
给你一个我以前用的代码: int InitCom() { if (INVALID_HANDLE_VALUE != g_hCom) CloseHandle(g_hCom); //初始化串口1 if (INVALID_HANDLE_VALUE == (g_hCom = ::CreateFile("\\\\.\\COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))) return -1; DCB dcb; ::memset(&dcb, 0, sizeof(DCB)); dcb.DCBlength = sizeof(DCB); dcb.BaudRate = CBR_19200; dcb.fBinary = 1; dcb.fParity = 1; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(g_hCom, &dcb); COMMTIMEOUTS CommTimeouts; ::memset(&CommTimeouts, 0, sizeof(COMMTIMEOUTS)); CommTimeouts.ReadIntervalTimeout = 50; CommTimeouts.ReadTotalTimeoutMultiplier = 1; CommTimeouts.ReadTotalTimeoutConstant = 1000; //不考虑延时和外触发 SetCommTimeouts(g_hCom, &CommTimeouts); return 0; }
b971049 2014-04-26
  • 打赏
  • 举报
回复
TimeOuts.ReadTotalTimeoutConstant=0; TimeOuts.ReadTotalTimeoutMultiplier=0; TimeOuts.WriteTotalTimeoutConstant=0; TimeOuts.WriteTotalTimeoutMultiplier=0; 都不应该设置成0 3、保险起见,dcb中这些参数应该这样设置: ::memset(&dcb, 0, sizeof(DCB)); dcb.DCBlength = sizeof(DCB); dcb.BaudRate = CBR_19200; dcb.fBinary = 1; dcb.fParity = 1; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = TWOSTOPBITS;
b971049 2014-04-26
  • 打赏
  • 举报
回复
1、SetupComm(hCom,1024,1024)没必要,让系统使用默认值就可以了, 2、TimeOuts设置不合理
公共马甲0315 2014-04-26
  • 打赏
  • 举报
回复

//额,异步方式打开串口,然后读写数据
hCom =CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); 

// 读数据之前要先清理一下错误
ClearCommError(......,  &comstate);
//如果没有数据就让它continue;
curRevLength = comstate.cbInQue;
if (curRevLength  == 0)
       continue;
else
   ReadFile();//读取curRevLength

//还是下载现成的代码抄抄更快些
串口发数据还算快吧,如果不满意,就把波特率再调高点儿。
s_hhm 2014-04-25
  • 打赏
  • 举报
回复
引用 1 楼 newTTTTTT 的回复:
呵呵,下位机设备才是这样做的,里头设置个大循环,设定一个轮询的周期间隔,不断地去读取串口的数据,读到了就是字节长度不为零,否则就是没有数据。 但是上位机软件用不着这么做,在xp系统下面,如果针脚2收到了数据,操作系统会有RX消息响应的,发送到你的窗口。 搂主不妨摆渡一些,找找异步方式读写串口的,就是设个线程来等待,直到系统将该消息发送给你的线程,然后再去读缓存,就有了
y 有两个疑问,还麻烦你解答下; 1.我的WriteFile函数虽然返回了,但实际并没有完成写入数据?所以在ReadFile函数时是取不到结果的?如果是这样,我将如何知道什么时候写入成功并可以读数据了? 疑问2:还是说我一定要写满缓存区(既我设定的SetupComm(hCom,1024,1024))才可以取到数据?
小小爬虾 2014-04-25
  • 打赏
  • 举报
回复
我从网上下载了个SerialDebugTool很好用。
lgstudyvc 2014-04-25
  • 打赏
  • 举报
回复
串口助手呢,调试看
洗洗睡去 2014-04-24
  • 打赏
  • 举报
回复
用mscomm吧 快的
公共马甲0315 2014-04-24
  • 打赏
  • 举报
回复
呵呵,下位机设备才是这样做的,里头设置个大循环,设定一个轮询的周期间隔,不断地去读取串口的数据,读到了就是字节长度不为零,否则就是没有数据。 但是上位机软件用不着这么做,在xp系统下面,如果针脚2收到了数据,操作系统会有RX消息响应的,发送到你的窗口。 搂主不妨摆渡一些,找找异步方式读写串口的,就是设个线程来等待,直到系统将该消息发送给你的线程,然后再去读缓存,就有了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧