不管是对于windows还是linux,串口通信的流程都是以下4步:
1. 打开串口
2. 设置串口
3. 发送、接收数据
4. 关闭串口
#include /*Windows API函数库*/
#include /*文件控制定义*/
#include /*POSIX 终端控制定义*/
#include /*标准输入输出定义*/
#include /*标准函数库定义*/
#include /*Unix 标准函数定义*/
#include
#include
HANDLE SerialHandle;
char buf[256] = {};
sprintf(buf, "\\\\.\\%s", com); //格式化字符串
//打开串口
SerialHandle = CreateFileA(buf, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); //同步模式打开串口
if (SerialHandle == INVALID_HANDLE_VALUE) //打开串口失败
return false;
int fd;
//打开串口
fd = open(com, O_RDWR|O_NOCTTY|O_NDELAY); //O_RDWR 读写方式打开;O_NOCTTY 不允许进程管理串口(不太理解,一般都选上);O_NDELAY 非阻塞(默认为阻塞,打开后也可以使用fcntl()重新设置)
if (-1 == fd)
return false;
//设置串口参数
//读串口原来的参数设置
DCB dcb;
GetCommState(SerialHandle, &dcb); //串口打开方式
//串口参数配置
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fBinary = TRUE; // 二进制数据模式
dcb.fParity = TRUE;
if (!SetCommState(SerialHandle, &dcb))
return false;
SetupComm(SerialHandle, 1024, 1024); //设置缓冲区
return true;
//串口参数配置
struct termios options; // 串口配置结构体
tcgetattr(fd,&options); // 获取串口原来的参数设置
bzero(&options,sizeof(options));
options.c_cflag |= B9600 | CLOCAL | CREAD; // 设置波特率,本地连接,接收使能
options.c_cflag &= ~CSIZE; // 屏蔽数据位
options.c_cflag |= CS8; // 数据位为 8 ,CS7 for 7
options.c_cflag &= ~CSTOPB; // 一位停止位, 两位停止为 |= CSTOPB
options.c_cflag |= PARENB; // 有校验
options.c_cflag &= ~PARODD; // 偶校验
tcflush(fd, TCIOFLUSH); // 清除所有正在发生的I/O数据。
if(tcsetattr(fd, TCSANOW, &options)!=0) // TCSANOW立刻对值进行修改
return false;
return true;
//发送数据
char pData[] = {};
DWORD WriteNum = 0;
if (WriteFile(SerialHandle, pData, sizeof(pData), &WriteNum, 0))
return true;
return false;
//发送数据
char pData[] = {};
int WriteNum = write(fd,pDataOpenO01,sizeof(pDataOpenO01));
if (WriteNum!=-1)
return false;
return true;
if (SerialHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(SerialHandle);
SerialHandle = INVALID_HANDLE_VALUE;
return true;
}
else
return false;
int flag=close(fd);
if (flag!=0)
return false;
return true;