我在win2000上运行我的可执行代码,其中串口通信通过下面方式建立的:
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FLAG_OVERLAPPED, NULL); if(m_hCom==INVALID_HANDLE_VALUE) return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_RXCLEAR);
SetCommMask(m_hCom, EV_RXCHAR);
当我打开过超级终端进行读取数据后,串口的发送数据就不正常,无法将数据传送出去!发送函数如下:
DWORD CStbDoc::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags; ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite); if(!fState)
{ if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// µÈ´ý
}
else
length=0;
} return length;
}可否有人指点一下这是为什么?怎么解决?多些!在线等待!
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FLAG_OVERLAPPED, NULL); if(m_hCom==INVALID_HANDLE_VALUE) return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_RXCLEAR);
SetCommMask(m_hCom, EV_RXCHAR);
当我打开过超级终端进行读取数据后,串口的发送数据就不正常,无法将数据传送出去!发送函数如下:
DWORD CStbDoc::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags; ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite); if(!fState)
{ if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// µÈ´ý
}
else
length=0;
} return length;
}可否有人指点一下这是为什么?怎么解决?多些!在线等待!
解决方案 »
- CWND指针
- 请问如何将一张1280*720的图片改成160*120的大小而又不让图片失真呢?
- CSocket的SendTo 为什么不阻塞!!
- C Socket封装成COM 方便调用
- 我最近自学VC++出现了一个问题!!!!!分不够在给!!!!在线等!!!
- 各位兄弟:我有一个字符串(有4K大),怎样压缩这个字符串哪里有算法?
- 各位高手:关于cedit编辑框mutiline风格,当拷入大概1M的文本时,发现不能输入文本了?
- 请问如何设置CListCtrl 中字体颜色?
- Adobe公布了photoshop-v.1.0.1版本的源代码,不过有几人能看的懂呢!
- 如何做一个彩色的ListBox?
- 影片截图问题,急,救命啊!!!!!!!!
- 添加一个类
WriteFile(m_hCom,buf,length,&length,NULL); //试一试
比如说超级终端打开了一个串口,你的程序再打开的话就会失败。那串口的发送数据就不正常,你可以跟踪看一下m_hCom还有效没!
DWORD CStbDoc::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite); if(!fState)
{ if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,false);// µÈ´ý
}
else
length=0;
}
SetCommMask(m_hCom,EV_RXCHAR);
return length;
}
这样写试试,应该没什么问题。
应该说我用两台机器通讯,他发给我得我可以收到,但是我回复的就不可以。这样子是不是m_hCom是有效的吧!
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,false);//一次GetOverlappedResult的调用不能保证数据写完成了,这个函数只查询IO结果.如果你调用你的WriteComm函数的频率高,很可能会使系统IO队列或缓冲溢出.
}
一般情况下是这样写的.
if(GetLastError()==ERROR_IO_PENDING)
{
while(!GetOverlappedResult(m_hCom,&m_osWrite,&length,false)
{
dwerror = GetLastError();
if(dwError = ERPOR_IO_INCOMPLETE)
countinue;
else
{
CkearCinnError(...........);
..................
break;
}
}
}
但是我个人认为用同步方试可能更有效一些,特别是数据量大的时候,因为里面的while循环可能会降低效率.
我本身的设置就是GetOverlappedResult(m_hCom,&m_osWrite,&length,true);这样还会有关系吗?
for(int i = 0; i < m_szWriteBuffer.GetLength (); i++)
{
bResult = WriteFile(hCom,
(LPSTR)m_szWriteBuffer[i],
1,
&BytesSent,
&m_ov);
}
也不好用,是不是哪里错了????
更搞笑的是 WriteFile()函数返回1,等于成功,但实际上确什么都没读到,
参数绝对没问题,只要不开那个vb的读卡程序就完全正常。
好像是 dcb.xoff = TRUE; dcb.yoff = TRUE;具体你在查一下就好了