windows下C语言怎么对串口进行读写操作?

Python0192

windows下C语言怎么对串口进行读写操作?,第1张

windows下对串口的操作可以通过WindowsAPI进行,也可以通过Linux下的read什么的直接操作,但是这种情况需要了解电路结构,比较麻烦,第三种有第三方提供的库,但是大多数针对C++,所以可能比较难找到顺手的第三方库.

那么,接下来就见要介绍一下串口通信用WindowsAPI通信的方式.

我们会发现,在文件名的位置填上"comX" X表示com口号,超过十的com口号需要另外的书写方式,这里不说了,因为网上一抓一大把,接下来,我们要对串口进行一系列的明确设置,这里就用到了一个结构体DCB结构,是专门用来描述一个com口的工作方式的,由于次结构体有28个成员,非常多,而且大部分的设置都是全世界通用的,所以,我们偷个懒,在打开一个com口之后,建立DCB结构体,接下来调用一个函数GetCommState用这个函数把现在com口的数据都写到DCB里,这样,比较通用的com口设置就已经弄好了,我们一般情况下只需要改一下DCB的波特率就好了,改好后马上用SetCommState把刚改好的结构体再写回去,这样串口就设置好了,现在还有点麻烦,串口设置好了,我们要它干什么呢?废话,读写数据呗,嘟~~~~~~可不能用fwrite和fread因为这个com口句柄不是文件句柄,是内核句柄,要用ReadFile和WriteFile来进行读写,又出麻烦了,我们怎么知道单片机什么时候发数据过来,就算我们知道,计算机什么时候知道啊?所以,一般的情况下,用ReadFile一直在哪检查,又是麻烦,通常情况下,一个com口的ReadFile设置是阻塞函数,影响编程啊!!!!!!

怎么办,很简单,你不阻塞吗,打通你呗,我们再建立里一个结构体COMMTIMEOUTS这个结构体描述里一个com口的相关超时设置,我们用GetCommTimeouts把数据读回来,具体的设置方法在网上也有,但是要注意,有一个MAXDWORD用它来设置读间隔超时设置就可以使ReadFile向kbhit()函数一样完全非阻塞了.

经过一些列的设置,事实上,现在已经可以通信了,要是有人觉得缓存不舒服,用SetupComm函数来重设缓存大小,对于传输速度比较快的通信,要把缓存设置的大些.

大致过程就是

配置串口通信,包括串口号、波特率、校验位、停止位这些信息;

打开串口,和打开文件一样,在Linux下是这样,Windows下没试过,估计也差不多;

发送数据,即写串口,就跟写文件类似;

读取串口,用read就行。

具体的函数和配置参数可以参考一些别人的代码。

肯定有区别的,而且相差还比较大。

因为read是用户态程序,然后每read一次都对应一次系统调用 (从用户态切换到内核态,再切回到用户态),其实耗时最多的就是状态切换。

如果一次性读取5个字节,那么就只有一次系统调用(两个状态切换),

如果一次读一字节,需要读5次,就有5次系统调用 (10个状态切换)。

具体相差多大,跟实际的环境有关,测试的话要大量的数据才能看出来。