分类: C/C++
2008-08-01 17:02:16
接收/发送数据
设计步骤:
初始化/打开串口
打开串口的第一步是初始化或设置串口配置,目的是创建串口代理,整篇文章我们都将用文件句柄作为串口代理。
创建端口句柄
串口句柄是可以被用来存取的串口对象句柄,创建串口句柄的函数是CreateFile,如下代码所示:
handlePort_ = CreateFile(portName, // 端口设备: 默认 "COM1" GENERIC_READ | GENERIC_WRITE, // 设备打开模式: 允许读写 0, // 不共享 NULL, // 默认安全设置 OPEN_EXISTING, // 打开方式:打开已经存在的端口 0, // 默认 NULL); // 默认如图2所示,portName = "COM1": portName 示一个const char*变量,它指定想创建串口句柄的端口名称。
// 获取串口当前配置 if (GetCommState(handlePort_,&config_) == 0) { AfxMessageBox("Get configuration port has problem."); return FALSE; }修改配置
// 指定用户参数 config_.BaudRate = dcb.BaudRate; // 波特率 config_.StopBits = dcb.StopBits; // 停止位 config_.Parity = dcb.Parity; // 奇偶校验 config_.ByteSize = dcb.ByteSize; // 数据位
波特率 (默认 = 9600)
0,1,2 = 1, 1.5, 2 (默认 = 0)
0-4= 无, 奇, 偶, 标志, 空格 (默认 = 0)
数据位, 4-8 (默认 = 8)
对于典型的通讯,建议程序员使用默认值。图3所示,Watch对话框显示了典型通讯使用的默认值。
图3:串口配置
保存配置
下一步是将已经修改的配置保存到设备控制中。调用SetCommState API函数保存配置。SetCommState函数设备控制块(DCB结构)配置通讯设备。该函数重新初始化所有的硬件控制设定,但不清空输入输出队列。代码如下所示:
if (SetCommState(handlePort_,&config_) == 0) { AfxMessageBox("Set configuration port has problem."); return FALSE; }设置通讯超时
// COMMTIMEOUTS对象 COMMTIMEOUTS comTimeOut; // 接收时,两字符间最大的时延 comTimeOut.ReadIntervalTimeout = 3; // 读取每字节的超时 comTimeOut.ReadTotalTimeoutMultiplier = 3; // 读串口数据的固定超时 // 总超时 = ReadTotalTimeoutMultiplier * 字节数 ReadTotalTimeoutConstant comTimeOut.ReadTotalTimeoutConstant = 2; // 写每字节的超时 comTimeOut.WriteTotalTimeoutMultiplier = 3; // 写串口数据的固定超时 comTimeOut.WriteTotalTimeoutConstant = 2; // 将超时参数写入设备控制 SetCommTimeouts(handlePort_,&comTimeOut);ReadIntervalTimeout
if (WriteFile(handlePort_, // 文件句柄 outputData, // 数据缓冲区指针 sizeBuffer, // 字节数 &length,NULL) == 0) // 接收成功发送数据长度的指针 { AfxMessageBox("Reading of serial communication has problem."); return FALSE; }提示:如果函数成功,返回非0值
if (ReadFile(handlePort_, // 句柄 inputData, // 数据缓冲区指针 sizeBuffer, // 字节数 &length, // 指向已经读入的字节数 NULL) == 0) // 重叠I/O结构体 { AfxMessageBox("Reading of serial communication has problem."); return FALSE; }提示:如果函数成功,返回非0值
if(CloseHandle(handlePort_) == 0) // 调用该函数关闭串口 { AfxMessageBox("Port Closeing isn''t successed."); return FALSE; }提示:如果函数成功,返回非0值 下载本文示例代码