如何用C语言写一个读、写串口的程序?

如何用C语言写一个读、写串口的程序?,第1张

大致过程就是

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

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

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

读取串口,让困用read就行。

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

#include <stdio.h>

#include <Windows.h>

int main(void)

{

FILE *fp

char temp

char buf[100]

if((fp = fopen("com3","r")) == NULL)

puts("this way doesn't work!\n")

else

puts("this way works!\n")

while(1)

{

temp = 0

fscanf(fp,"%c",&temp)

if(temp != 0)

putchar(temp)

else

Sleep(100)

}

fclose(fp)

return 0

}

以前弄的,好久没看了,不知到对不对。

还有下面这段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

#include <Windows.h>

#include <stdio.h>

HANDLE hCom

int main(void)

{

hCom=CreateFile(TEXT("COM3"),//COM1口

GENERIC_READ|GENERIC_WRITE, //允许读和写

0, //独占方式

NULL,

OPEN_EXISTING, //打开芹配而不是创建

0, //同步方式

NULL)

if(hCom==(HANDLE)-1)

{

printf("打开COM失败!\n")

return FALSE

}

else

{

printf("COM打开成功!\n")

}

SetupComm(hCom,1024,1024)//输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts

//设定读超时

TimeOuts.ReadIntervalTimeout=1000

TimeOuts.ReadTotalTimeoutMultiplier=500

TimeOuts.ReadTotalTimeoutConstant=5000

//设定写超时

TimeOuts.WriteTotalTimeoutMultiplier=500

TimeOuts.WriteTotalTimeoutConstant=2000

SetCommTimeouts(hCom,&TimeOuts)//设置超时

DCB dcb

GetCommState(hCom,&dcb)

dcb.BaudRate=9600//波特率为9600

dcb.ByteSize=8//每个字节有8位

dcb.Parity=NOPARITY//无奇偶校验位

dcb.StopBits=ONE5STOPBITS//两个停止位

SetCommState(hCom,&dcb)

DWORD wCount//读取的字节数

BOOL bReadStat

while(1)

{

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR)//清空缓冲区

char str[9]={0}

printf("%s\n",str)

bReadStat=ReadFile(hCom,str,9,&wCount,NULL)

if(!bReadStat)

{

printf("读串口失败!")

return FALSE

}

else

{

str[8]='\搏罩0'

printf("%s\n",str)

}

Sleep(100)

}

}

以上两段代码是一年前弄的,嫌银指我记得可以用,你试试。

if(a&(1<<(i-1))) RW_SID=1

表示1左移i-1位再于a进行与运算,i=8的情况下i-1=7,1左移7位就是0x80。再跟a与运算(全1出1有0出0)即可获得a的最高位。以此类推可以取出a的所有位。

if(RW_SID==1) dat|=(1<<(i-1))

当RW_SID端口为1时把1左移i-1位跟dat或运算。i=8的情况下1左移i-1位正好是0x80,再经过与缺扰运算保存最高位,循环移位再或伏迅旦运算就能读取到全部位保存在dat里面

可以写成

//写部分

if(a&0x80)//取出a的最昌薯高位

RW_SID=1//如果是1则输出1

else

RW_SID=0//否则输出0

a<<=1//a整体左移,让第7位补到最高位的位置,循环取出

E_CLK=1

delay(100)

E_CLK=0

delay(100)

//读部分

E_CLK=1

delay(100)

dat<<=1//接收1次数据后左移。第一次为0的情况影响数据

if(RW_SID)//当端口为高的时候

dat++//dat+1相当于dat|=1 当端口为0的时候默认左移最低位是补零的,所以不用管

E_CLK=0//循环8次后第一次接受到的数据就在最高位了

delay(100)

效果是一样的相对来说比较好理解


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12384771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存