在OnTimer函数中读取rs232接口数据,为什么总是读取失败?请各位帮我,3kx!!!

fagin 2003-10-16 04:14:37
各位高手,我在OnTimer函数中读取rs232接口数据,为什么总是读取失败?请各位帮我
看看原因在哪里
我在OnInitialUpdate()函数中已经打开com接口了。
程序代码如下:
void CRetestView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
DWORD dRead,dReadNum;
OVERLAPPED osRead={0};
BYTE buff [1000];
dRead=ReadFile(hCom, &buff[1000], 10, &dReadNum, NULL); //接收100个字符,
CString s1;
s1.Format("%d",dRead);
pDC->TextOut(100,230,s1);
CFormView::OnTimer(nIDEvent);
}
是这样的吗?
hCom = CreateFile ("COM1",GENERIC_READ| GENERIC_WRITE,0,NULL,OPEN_EXISTING,F
ILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if (hCom==INVALID_HANDLE_VALUE)
{
AfxMessageBox("无法打开串行口");
}
else
{
SetCommMask(hCom, EV_RXCHAR ) ;
SetupComm(hCom, 4096, 4096 ) ; //设置收发缓冲区 尺寸为4K
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR )
; //清收发缓冲区
//以下初始化结构变量CommTimeOuts, 设置超时参数
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
CommTimeOuts.ReadTotalTimeoutConstant = 4000 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 4000 ;
SetCommTimeouts(hCom, &CommTimeOuts ); //设置超时参数
ComDcb.DCBlength = sizeof( DCB ) ;
GetCommState( hCom, &ComDcb ) ; //获取当前参数
ComDcb.BaudRate =9600; //波特率
ComDcb.ByteSize = 8; //数据位
ComDcb.Parity = 0; //校验 0~4=no, odd, even, mark, space
SetCommState(hCom, &ComDcb ) ;
}
...全文
125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyh12345678 2003-12-25
  • 打赏
  • 举报
回复
你为何不用一线程监控串口.
你只要接收串口事件不就OK
nuaawenlin 2003-12-23
  • 打赏
  • 举报
回复
FILE_FLAG_OVERLAPPED
不能用
因为你没有定义一个OVERLAPPED结构体
况且你的ReadFile(hCom, &buff[1000], 10, &dReadNum, NULL);
NULL表示你不用从叠方式
删去即可
lansefeng 2003-12-22
  • 打赏
  • 举报
回复
按照 zxj7957(zxj7957) 的试试吧
还要确定,串口的确有东西,而且,和它通信的设备的波特率等的属性值要一致才行
ffllyy 2003-12-22
  • 打赏
  • 举报
回复
你这个东西还真够破的,害我找半天,你没事儿加这个干什么???
FILE_FLAG_OVERLAPPED
Sander 2003-12-22
  • 打赏
  • 举报
回复
怎么在Ontimer中做,应该用thread, waitcommevent做
nscboy 2003-12-21
  • 打赏
  • 举报
回复
你的先用

DWORD dwErrorFlags;COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
int iReadNum = ComStat.cbInQue ;
if(iReadNum>0){
dRead=ReadFile(hCom, &buff[1000], 10, &dReadNum, NULL);
}
判断缓冲区内是否有数据
如果有才可以读取
zxj7957 2003-12-21
  • 打赏
  • 举报
回复
dRead=ReadFile(hCom, &buff[1000], 10, &dReadNum, NULL); //接收100个字符,
这句好像有问题吧,这样如何
char buff[1000];
dRead=ReadFile(hCom,buff,10,@dReadNum,NULL);

oyj8181 2003-12-18
  • 打赏
  • 举报
回复
up 关注中!
Tom4 2003-11-21
  • 打赏
  • 举报
回复
up too!!
  • 打赏
  • 举报
回复
友情UP!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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