配置串口通信,包括串口号、波特率圆谨、校验位、橘滑基停止位这些信息;
打开串口,和打开文件一样,在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)
效果是一样的相对来说比较好理解
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)