2018-03-27windows下的串口发送(c语言)

第一步:打开串口

打开串口使用的是CreateFile函数,
原型:
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写 / 读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄,此例为NUll即可
);
CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。
文件
pipes
邮槽
通信资源
磁盘驱动器(仅适用于 windowsNT )
控制台
文件夹(仅用于打开)

失败时会返回INVALID_HANDLE_VALUE,成功则返回串口句柄。

第二步:配置串口并让配置生效

1.使用SetupComm(串口句柄, 输入缓冲区, 输出缓冲区) 该函数来设置缓冲区大小(单位字节)。
2.设置超时。使用结构体COMMTIMEOUTS,
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
参数解释:
ReadIntervalTimeout:两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。设置为0表示该参数不起作用。 指定通讯线上两个字符到达的最大时延,以毫秒为单位。在ReadFile操作期间,时间周期从第一个字符接收到算起。如果收到的两个字符之间的间隔超过该值,ReadFile操作完毕并返回所有缓冲数据。如果ReadIntervalTimeout为0,则该值不起作用。

如果值为MAXDWORD, 并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier两个值都为0, 则指定读操作携带已经收到的字符立即返回,即使没有收到任何字符。

ReadTotalTimeoutMultiplier:读取每字符间的超时。 指定以毫秒为单位的累积值。用于计算读操作时的超时总数。对于每次读操作,该值与所要读的字节数相乘。

ReadTotalTimeoutConstant:一次读取串口数据的固定超时。所以在一次读取串口的操作中,其超时为 ReadTotalTimeoutMultiplier乘以读取的字节数再加上 ReadTotalTimeoutConstant。将ReadIntervalTimeout设置为MAXDWORD,并将 ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant设置为0,表示读取操作将立即返回存放在输入缓冲区的字符。

WriteTotalTimeoutMultiplier:写入每字符间的超时。

WriteTotalTimeoutConstant:一次写入串口数据的固定超时。所以在一次写入串口的操作中,其超时为WriteTotalTimeoutMultiplier乘以写入的字节数再加上 WriteTotalTimeoutConstant。

使用SetCommState(串口句柄,定义的超时结构体 )来使超时设置成效

设置串口参数

利用DCB结构体来配置
常用的有:
DCB dcb;
dcb.BaudRate = 9600; //波特率9600
dcb.ByteSize = 8; //8位数据位
dcb.Parity = NOPARITY; //无校验位
dcb.StopBits = ONE5STOPBITS;//1位停止位

使用SetCommState(串口句柄,定义的串口结构体 )来使超时设置成效

第三步 :发送或接收

发送使用WriteFile函数

BOOL WriteFile(
HANDLE hFile,//文件的句柄
LPCVOID lpBuffer,//用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToWrite,//要读入的字符数
LPDWORD lpNumberOfBytesWritten,//指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped//如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);

接收使用ReadFile函数

BOOL ReadFile(

HANDLE hFile, //文件的句柄

LPVOID lpBuffer, //用于保存读入数据的一个缓冲区

DWORD nNumberOfBytesToRead, //要读入的字符数

LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针

LPOVERLAPPED lpOverlapped //同上

);

打完收工

释放句柄CloseHandle(第一步时获取的句柄);

蛇蛇的代码(瞎几把注释):https://github.com/ChenDuXiu/Serial-Port.git

你可能感兴趣的:(2018-03-27windows下的串口发送(c语言))