c语言接收串口数据
⑴ c语言如何处理51串口接收数据
1、51单片机串行口是独立的硬件,对其设置完之后,它就独立工作了。如果REN=1,它会自动检测RXD,当它收齐了一帧数据,就自动将数据放到(接收)SBUF,然后在RI置一。 CPU的中断系统,如果已经开放了串口中庆氏败断,CPU就会自动转到0023H去执行程序。
2、例程:
#include<AT89X51.H>//单片机51头文件,存放着单片机的寄存器
unsignedchardat;//用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbitgewei=P2^2;核此//个位选通定义
sbitshiwei=P2^3;//十位选通定义
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};//0,1,2,3,4,5,6,7,8,9
voidDelay(unsignedinttc)//延时程序
{
while(tc!=0)
{unsignedinti;
for(i=0;誉颤i<100;i++);
tc--;}
}
voidLED()//LED显示接收到的数据
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
voidInit_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
}
voidmain()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////
{
Init_Com();//串口初始化
//P1=0xf0;
while(1)
{
if(RI)//扫描判断是否接收到数据,
{
dat=SBUF;//接收数据SBUF赋与dat
RI=0;//RI清零。
SBUF=dat;//在原样把数据发送回去
}
LED();//显示接收到的数据
}
}
⑵ c语言怎么实现串口通信
编程原理
程序1为查询通信方式接口程序,为一典型的数据采集例程。其中bioscom()函数初始化COM1(此函数实际调用BIOS
INT
14H中断0号功能)。这样在程序中就避免了具体设置波特率因子等繁琐工作,只需直接访问发送/接收寄存器(3F8H)和线路状态寄存
⑶ 串口接收数据C语言如何判是 或
串口接收是一个字节一个字节接收的。
将接收的字节存入缓存中,然后判陵基断存入的数据是否是
就可以了
char
recbuf[256]
//接收缓存
int
recvcount
=
0;
//接收计数
if
(recdata
!=
'
')
{
recbuf[recvcount++]
=
recdata;
//如果数据不为'
'则存入缓存
}
else
{
//如果接收液汪升的是'闹老
',且上一个接收到得数据为'
',则结束
if(recbuf[recvcount-1]
==
'
')
{
recbuf[recvcount-1]
=
0x00;
//以0x00结尾
recvcount
=
0;
//计数归零
……后续操作
}
else
{
//如果上一个数据不为'
'则继续接收
recbuf[recvcount++]
=
recdata;
}
}
⑷ c语言 让计算机像单片机一样接收串口发来的数据
可以使用串口助手软件,或者自己编定软件,VB、VC的编程使用MSCOMM控件实现串口通信,但是如果是与下位机通信光有上位机软件是不行的,还要有与下位机连接的串口线,但是电脑串口线不能与下位机直接连接,因为计算机采用负逻辑,需冲贺毕要使用MAX232或者其他电散芹平转换芯片转换电平拍改后才能与下位机进行串口通信
⑸ 怎样在WINDOWS下用C语言编写串口接收数据程序
#include
#include
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
#include
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);
}
}
以上两段代码是一年前弄的,我记得可以用,你试试。
⑹ 怎样在WINDOWS下用C语言编写串口接收数据程序
#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);
}
}
以上两段代码是一年前弄的,我记得可以用,你试试。
⑺ 编写单片机串口收发数据的完整程序(C语言编写)
我用的新唐芯片,8051内核,跟51差不多,望采纳
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
这个是发送
void UART_isr (void) interrupt 4 //串行中断服务程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收
⑻ C语言变成实现串口收发数据
#include <reg51.h>
#include <intrins.h>
unsigned char key_s, key_v, tmp;
char code str[] = "welcome!www.willar.com
";
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit K1 = P1^4;
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断
while(1)
{
if(scan_key()) // 扫描按键
{
delayms(10); // 延时去抖动
if(scan_key()) // 再次扫描
{
key_v = key_s; // 保存键值
proc_key(); // 键处理
}
}
if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = tmp; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
}
}
bit scan_key()
// 扫描按键
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
// 键处理
{
if((key_v & 0x01) == 0)
{ // K1按下
send_str(); // 传送字串"welcome!...
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
void send_str()
// 传送字串
{
unsigned char i = 0;
while(str[i] != '