求教!串口通信

llb2000 2001-09-20 04:49:26

用pc机与单片机通过串口实现多机通信,请问怎么实现软件握手协议?
还有,我发一条地址桢后,相应的单片机回发确认数据如0xaa,
我如何读取这一个字符?
...全文
158 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
llb2000 2001-09-22
  • 打赏
  • 举报
回复
我现在这个问题还没解决,程序如下,问题是不管如何设置,ReadFile总是返回true,让我的阻塞语句毫无用处,简直快疯了,程序如下,麻烦大虾帮忙看看,多谢
UINT ComInputThread(void *arglist)
{
CRecSenior *port = (CRecSenior*) arglist;

OVERLAPPED AsyncReadInfo = {0};
OVERLAPPED AsyncStatusInfo = {0};
AsyncReadInfo.hEvent = CreateEvent(NULL,true,false,NULL);
AsyncStatusInfo.hEvent = CreateEvent(NULL,true,false,NULL);
assert( AsyncReadInfo.hEvent );
assert( AsyncStatusInfo.hEvent );

DWORD dwCommEvent;
bool waiting_on_status = false;
port->m_bInputThreadReading = false;

port->clear_error();

HANDLE handles[4] = {
port->m_hKillInputThreadEvent,
AsyncReadInfo.hEvent,
AsyncStatusInfo.hEvent,
port->m_hReadRequestEvent};

SetCommMask( port->m_hPort,
EV_BREAK | EV_CTS | EV_DSR | EV_RXCHAR |
EV_ERR | EV_RING | EV_RLSD | EV_TXEMPTY );

for ( bool done = false ; !done ; )
{
int bytes_to_read = 0;
char read_buffer[ 256 ];
DWORD dwBytesRead;
if ( !port->m_bInputThreadReading )
{
bytes_to_read = port->m_RxQueue.SpaceFree();
if ( bytes_to_read > 256 )
bytes_to_read = 256;

if (bytes_to_read >0)
{
if(!ReadFile(port->m_hPort,
read_buffer,
bytes_to_read,
&dwBytesRead,
&AsyncReadInfo))
{
port->m_bInputThreadReading = true;
}
else
{
if( dwBytesRead)
{
port->m_RxQueue.Insert(read_buffer,dwBytesRead);
}
}
}
else
{
ResetEvent( AsyncReadInfo.hEvent );
}
}

if ( !waiting_on_status )
{
if ( !WaitCommEvent( port->m_hPort,
&dwCommEvent,
&AsyncStatusInfo ) )
waiting_on_status = true;
port->clear_error();
}

if ( waiting_on_status &&
( port->m_bInputThreadReading || bytes_to_read == 0 ) )
{
DWORD result = WaitForMultipleObjects( 4,
handles,
FALSE,
INFINITE );
switch(result)
{
case 0://m_hKillInputThreadEvent
done = true;
break;
case 1://AsyncReadInfo.hEvent
if ( GetOverlappedResult( port->m_hPort,
&AsyncReadInfo,
&dwBytesRead,
false ) )
{
if ( dwBytesRead )
{
port->m_RxQueue.Insert( read_buffer, dwBytesRead );
}
}
port->m_bInputThreadReading = false;
// SetEvent(port->m_hDataProcessEvent);
break;
case 2://AsyncStatusInfo.hEvent
DWORD dwOverlappedResult;
if ( GetOverlappedResult( port->m_hPort,
&AsyncStatusInfo,
&dwOverlappedResult,
false ) )
port->clear_error();
waiting_on_status = false;
break;
case 3 :
break;
default :
done = true;
// assert( false );
}
}
}

CloseHandle(AsyncReadInfo.hEvent);
CloseHandle(AsyncStatusInfo.hEvent);

SetEvent(port->m_hInputThreadKilledEvent);

return 0;

}
ximuwa 2001-09-21
  • 打赏
  • 举报
回复
非常关注!
steventt 2001-09-21
  • 打赏
  • 举报
回复
你可以设置事件,次事件就是EV_RXCHAR(接收到任何字符并放进缓冲区中),当有字符收到时,立即启动ReadFile();
llb2000 2001-09-20
  • 打赏
  • 举报
回复
我的意思是这样的,pc发了地址桢给单片机后,单片机确认后给pc发一个0xaa表示确认,问题就是我用ReadFile函数如何读啊,书上说如果串口有足够的数据填充请求的缓冲区,则函数会立即返回,而且能够马上使用数据,但如果不能填充,就会开始异步读操作,我现在给的缓冲区肯定不止一个字节,那ReadFile函数会怎么运行?结果呢>
mlike 2001-09-20
  • 打赏
  • 举报
回复
现在一般的书上都有,软件握手协议一般是自己定的。
neomeng 2001-09-20
  • 打赏
  • 举报
回复
协议要自己定啊。
kaoms 2001-09-20
  • 打赏
  • 举报
回复
可以采用一个二进制序列来控制
zzh 2001-09-20
  • 打赏
  • 举报
回复
通过对数据进行打包,比如每512个字节这一包或者每1024个字节为一个包,分为包头包尾,可以使用0x01或0x02这种特殊字符来充当包头或包尾,但对于在数据当的字符,必须转译,可以使用两个0x01来代替。这样就不会出错了。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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