如何向串口读写数据

BabyGoblin 2002-07-27 10:35:38
请问如何设置串口波特率,及向串口读写数据
...全文
411 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugyouth 2002-07-27
和源代码
回复
bugyouth 2002-07-27
http://www.gjwtech.com/
有大量关于串口通讯的文章
回复
Frank0233 2002-07-27
// 配置串行口

BOOL CTerminalDoc::ConfigConnection()

{

DCB dcb;
if(!GetCommState(m_hCom, &dcb))

return FALSE;

dcb.fBinary=TRUE;

dcb.BaudRate=m_nBaud; // 波特率

dcb.ByteSize=m_nDataBits; // 每字节位数

dcb.fParity=TRUE;

switch(m_nParity) // 校验设置

{

case 0: dcb.Parity=NOPARITY;

break;

case 1: dcb.Parity=EVENPARITY;

break;

case 2: dcb.Parity=ODDPARITY;

break;

default:;

}

switch(m_nStopBits) // 停止位

{

case 0: dcb.StopBits=ONESTOPBIT;

break;

case 1: dcb.StopBits=ONE5STOPBITS;

break;

case 2: dcb.StopBits=TWOSTOPBITS;

break;

default:;

}

// 硬件流控制设置

dcb.fOutxCtsFlow=m_nFlowCtrl==1;

dcb.fRtsControl=m_nFlowCtrl==1?

RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;

// XON/XOFF流控制设置

dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;

dcb.XonChar=XON;

dcb.XoffChar=XOFF;

dcb.XonLim=50;

dcb.XoffLim=50;

return SetCommState(m_hCom, &dcb);

}
回复
zjlsyxf 2002-07-27
程序专门建立了一个串口通信类,下面给出关键成员函数的核心代码。

BOOL InitComm file://串口初始化,这里只给出关键步骤的代码,下同
{
 HANDLE m_hComm;
 COMMTIMEOUTS m_CommTimeouts;
 m_hComm = CreateFile("COM1", file://在这里只使用串口1
  GENERIC_READ | GENERIC_WRITE, file://打开类型为可读写
  0, file://以独占模式打开串口
  NULL, file://不设置安全属性
  OPEN_EXISTING,
  FILE_FLAG_OVERLAPPED, file://重叠I/O方式
  0);
 if (m_hComm == INVALID_HANDLE_VALUE) file://打开不成功
  {return FALSE;}
 m_CommTimeouts.ReadIntervalTimeout = 1000;
 file://进行超时设置,读者应根据自己的实际需要设置
 m_CommTimeouts.ReadTotalTimeoutMultiplier = 500;
 m_CommTimeouts.ReadTotalTimeoutConstant = 5000;
 m_CommTimeouts.WriteTotalTimeoutMultiplier = 500;
 m_CommTimeouts.WriteTotalTimeoutConstant = 5000;
 if (!SetCommTimeouts(m_hComm, &m_CommTimeouts))
  {CloseHandle(m_hComm);
   return FALSE;}
 PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); file://清缓冲
 return TRUE;
}




以上是专门针对COM1的初始化,如果要利用同一函数对不同串口初始化,则要在初始化前先进入代码临界区,以保证在某一时刻只进行一个串口的初始化。

  在串口初始化成功后,就可以建立监控线程处理串口通信事件。下面是该线程的关键代码。

UINT CommThread(LPVOID pParam) file://用于监控串口的工作者线程
{
 BOOL bResult = FALSE;
 if (m_hComm) file://查看端口是否打开,这里m_hComm同上,作者在这里做了简化
  PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT |    PURGE_TXABORT);
  for (;;) file://只要线程运行,就处于监视端口行为的无限循环
  {
   bResult = WaitCommEvent(m_hComm, &Event, &m_ov);
   file://m_ov是OVERLAPPED类型的成员变量
   if (!bResult)
    { file://进行出错处理}
   else
   {
    Event = WaitForMultipleObjects(4, m_hEvent, FALSE, INFINITE);
    file://无限等待设定的事件发生,数组m_hEvent根据需要定义了须响应的接收,发送,关闭端口事件和OVERLAPPED类型的hEvent事件
    switch (Event)
    { file://读写事件的响应处理过程,在此略}
    }
    return 0;
 }




这样监控主程序就可以使用AfxBeginThread()函数来产生CommThread串口监控线程。如果要实现对所有端口的同时监控,可以分别对端口建立监控线程。
回复
BabyGoblin 2002-07-27
我用的是代码,CPP_FAN()请您说得具体些好吗?
回复
Cpp_fan 2002-07-27
用API 的话可以用
ReadFile ,WriteFile,CreateFile 几个函数来做到!
回复
doublesword 2002-07-27
你是不是用MSComm控件,还是其他什么东西?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告