求教串口API发送问题

马踏猪头 2013-11-13 05:37:42
最近在用VC6.0写一个串口DLL,本人以前做单片机的,头一次写MFC程序,研究了几天,大部分功能算是有了,但是有个writefile的问题令我十分头疼。

调用写函数的时候,写数据长度大于14的情况下,每次都是成功14个,剩下的就没发出去,返回成功发送数是14,这种情况有人遇见没?


int WINAPI WriteData(HANDLE hComm,char *cData,unsigned long ulLength,unsigned long * BytesWritten)
{
ComInfoList *p;
BOOL bStat;

p = CheckList(pHead,hComm);
if(p == NULL)
{
*BytesWritten = 0;
return SEND_DATA_FAIL;
}

if(p->hReader == NULL)
{
*BytesWritten = 0;
return SEND_DATA_FAIL;
}

if(p->myoverlapped.hEvent == NULL)
{
*BytesWritten = 0;
return SEND_DATA_FAIL;
}

if(!WriteFile(p->hComm,cData,ulLength,BytesWritten,&p->myoverlapped))
{
if(GetLastError() == ERROR_IO_PENDING)
{
bStat = WaitForSingleObject(p->myoverlapped.hEvent,INFINITE);
switch(bStat)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(p->hComm,&p->myoverlapped,BytesWritten,FALSE))
{
return SEND_DATA_FAIL;
}
break;
default:
return SEND_DATA_FAIL;
break;
}
}
else
{
return SEND_DATA_FAIL;
}
}

return 0;
}
...全文
67 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
马踏猪头 2013-11-14
  • 打赏
  • 举报
回复
问题找到了,是我的timeout设置问题 COMMTIMOUTS的WriteTotalTimeoutConstant设定的时间太短了,以前设定为10,我改成1000了。 我以为WriteFile函数是将数据写入发送缓存,然后由驱动进行发送,但是实际看起来不是,而是直接从串口发送成功的才算是发送成功,总感觉这样不好,但是也没啥办法了。
马踏猪头 2013-11-14
  • 打赏
  • 举报
回复
感觉不太像楼上说的那样,发送不同的字符串,同样的效果。 今天调试了一下,发现p->myoverlapped.InternalHigh这个参数在执行完GetLastError()后,变成了14,这个参数应该是系统控制的,跟GetLastError应该也没什么关系吧,很头疼。 或者是这个GetLastError执行的太快?使得p->myoverlapped.InternalHigh没有充分执行? 再想想办法。
hdg3707 2013-11-14
  • 打赏
  • 举报
回复
而且按二进制发送,不要按字符发送,在DCB里有设置
hdg3707 2013-11-14
  • 打赏
  • 举报
回复
有可能是参数类型不对,不要用char,要改成BYTE或unsigned char,用字符有可能把0当成结束符了

2,586

社区成员

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

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