扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:郎锐 来源:yesky 2007年11月16日
关键字:
typedef struct tagCOM_CONFIG { int nPort; file://端口号,从COM1到COM4 int nBaud; file://波特率,从1200bps到57600bps(对应的宏为CBR_1200到CBR_57600) int nData; file://数据位个数,7位或是8位 int nStop; file://停止位个数,可以是1位、1.5位、2位。 int nParity;//采取的校验方式,有无校验(NOPARITY)、 file://奇校验(ODDPARITY)和偶校验(EVENPARITY)等。 }COM_CONFIG; |
//以创建文件的形式打开文件,并将返回的端口句柄保存于句柄idComDev之中。 idComDev =CreateFile( g_szCom_Port[g_com_config.nPort], GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); …… file://cfg为COMMCONFIG结构的实例对象,获取当前通讯口的状态。 cfg.dcb.DCBlength = sizeof( DCB ) ; GetCommState( idComDev, &(cfg.dcb) ) ; file://设置发送、接收缓存大小 SetupComm( idComDev, 4096, 4096 ) ; // PurgeComm()是一个清除函数,它可以用来中止任何未决的后台读或写,并且可以冲掉I/O file://缓冲区.其中:PURGE_TXABORT 用于中止后台写操作;PRUGE_RXABORT用于中止后台 file://读操作 ;PRUGE_TXCLEAR用于清除发送缓冲区;PRUGE_RXCLEAR用于清除接收缓冲区 PurgeComm(idComDev,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); file://根据设置的参数填充DCB结构对象dcb的各个数据成员变量 dcb.DCBlength = sizeof( DCB ) ; GetCommState( idComDev, &dcb ) ; file://设置端口通讯参数 dcb.BaudRate =g_Com_Baud[g_com_config.nBaud]; dcb.ByteSize =g_Com_ByteSize[g_com_config.nData]; dcb.Parity =g_Com_Parity[g_com_config.nParity] ; dcb.StopBits =g_Com_StopBits[g_com_config.nStop]; file://硬件流控制 dcb.fDtrControl = DTR_CONTROL_DISABLE ; dcb.fOutxCtsFlow = FALSE ; dcb.fRtsControl = RTS_CONTROL_DISABLE ; file://软件流控制 dcb.fInX = dcb.fOutX = FALSE ; dcb.XonChar = (char)0xFF ; dcb.XoffChar = (char)0XFF ; dcb.XonLim = 100 ; dcb.XoffLim = 100 ; dcb.EvtChar=0x0d; dcb.fBinary = TRUE ; dcb.fParity = TRUE ; file://超时控制的设置。超时有两种:区间超时:(仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间;总超时: 当读或写特定的字节数需要的总时间超过某一阈值时,超时触发。计算超时可以根据公式: file://ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read)+ // ReadToTaltimeoutConstant file://WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write)+ // WritetoTotalTimeoutConstant file://如果在设置超时时参数为0则为无限等待,即无超时。 CommTimeOuts.ReadIntervalTimeout =MAXDWORD; CommTimeOuts.ReadTotalTimeoutMultiplier =0; CommTimeOuts.ReadTotalTimeoutConstant = 0 ; CommTimeOuts.WriteTotalTimeoutMultiplier =2*9600/dcb.BaudRate ; CommTimeOuts.WriteTotalTimeoutConstant = 25 ; SetCommTimeouts(idComDev , &CommTimeOuts ) ; file://根据设置好的dcb结构设置好通讯口的状态,并开启用于侦听端口,监视从外设传来的数 file://据的线程COMReadThreadProc。 if (SetCommState( idComDev, &dcb )) { m_bComPortOpen=TRUE; g_hCom=idComDev; AfxBeginThread(COMReadThreadProc,NULL,THREAD_PRIORITY_NORMAL); return; } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者