c语言中串口接收数据函数

C语言变成实现串口收发数据

#include reg51.h

#include intrins.h

unsigned char key_s, key_v, tmp;

char code str[] = “welcome!  \n\r”;

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] != ‘\0’)

{

SBUF = str[i];

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

i++; // 下一个字符

}

}

void delayms(unsigned char ms)

// 延时子程序

{

unsigned char i;

while(ms–)

{

for(i = 0; i 120; i++);

}

}

拓展资料

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

c语言中串口接收数据函数

C语言如何处理51串口接收数据?

1、51单片机串行口是独立的硬件,对其设置完之后,它就独立工作了。如果REN=1,它会自动检测RXD,当它收齐了一帧数据,就自动将数据放到(接收)SBUF,然后在RI置一。 CPU的中断系统,如果已经开放了串口中断,CPU就会自动转到0023H去执行程序。

2、例程:

#include AT89X51.H//单片机51头文件,存放着单片机的寄存器

unsigned char dat;        //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

sbit gewei=P2^2;          //个位选通定义

sbit shiwei=P2^3;         //十位选通定义

unsigned char code table[]={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

void Delay(unsigned int tc)     //延时程序

{

while( tc != 0 )

   {unsigned int i;

    for(i=0; i100; i++);

    tc–;}

}

void LED()    //LED显示接收到的数据

{  

   shiwei=0; 

   P0=~table[dat/16]; 

   Delay(8); 

   shiwei=1;

   gewei=0;  

   P0=~table[dat%16]; 

   Delay(5); 

   gewei=1;

}

void Init_Com(void)//功能:串口初始化,波特率9600,方式1

{

     TMOD = 0x20;

     PCON = 0x00;

     SCON = 0x50;

     TH1 = 0xFd;

     TL1 = 0xFd;

     TR1 = 1;

}

void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////

{

  Init_Com();//串口初始化

//  P1=0xf0;

  while(1)

   {

       if ( RI )      //扫描判断是否接收到数据,

       {

            dat = SBUF;//接收数据SBUF赋与dat

     RI=0;           //RI清零。

            SBUF = dat;//在原样把数据发送回去

}

LED();  //显示接收到的数据

   }

}

C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢

#includereg52.h

unsigned char code table[]={” “};

unsigned char code table1[]={” : “};

sbit rs=P1^2;

sbit lcden=P1^0;

unsigned char flag,m;

void delay(int xms)

{

int i,j;

for(i=xms;i0;i–) //i=xms即延时约xms毫秒

for(j=110;j0;j–);

}

void write_com(unsigned char com)

{//写液晶命令函数

rs=0;

lcden=0;

P2=com;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

void write_date(unsigned char date)

{//写液晶数据函数

rs=1;

lcden=0;

P2=date;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

void init()

{//初始化函数

unsigned char num;

lcden=0;

rs=0;

write_com(0x38);//1602液晶初始化

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(num=0;num15;num++)//写入液晶固定部分显示

{

write_date(table[num]);

delay(3);

}

write_com(0x80+0x40);

for(num=0;num5;num++)

{

write_date(table1[num]);

delay(3);

}

}

void write_dianya(unsigned char add,unsigned char date)

{//1602液晶刷新时分秒函数4为时,7为分,10为秒

unsigned char bai,shi,ge;

bai=date/100;

shi=date%100/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+bai);

write_date(0x30+shi);

write_date(0x30+ge);

}

void main ()

{

init();

TMOD=0x20; //设置定时器1工作方式2

TH1=0xfd;

TL1=0xfd;

TR1=1;

REN=1; //设置串行口工作方式

SM0=0;

SM1=1;

EA=1; //中断设置

ES=1;

while(1)

{

if(flag==1)

{

ES=0;

SBUF=m;

while(!TI);

TI=0;

ES=1;

}

}

}

void ser() interrupt 4

{

RI=0;

m=SBUF;

write_dianya(5,m);

flag=1;

}

怎样在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);

}

}

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

能写出查询方式UART0接收和发送数据的C语言程序

#includepic.h //包含单片机内部资源预定义

#ifndef uchar

#define uchar unsigned char

#define uint unsigned int

#endif

//__CONFIG(0x2129);

bit rec_flag;//串口中断标志位,有串口中断,置1

uchar uartdata;//串口数据保存到此位置中

void Uart_char(uchar dat);//串口发送一个数据

/*************************************************************

函数原型:void main(void)

功 能:等待串口发送中断到来,将接收到的设计再通过串口发回

*************************************************************/

void main(void)

{

TRISB1=1;

TRISB2=1;

SPBRG=0X19; //设置波特率为9600BPS

TXSTA=0X24; //使能串口发送,选择高速波特率

RCSTA=0X90; //使能串口工作,连续接收

RCIE=0X1; //使能接收中断

GIE=0X1; //开放全局中断

PEIE=0X1; //使能外部中断

//INTCON=0X00;

/*while(1) //查询模式下

{

RCIE=1;

while(RCIF==0);

RCIE=0;

Send_char(RCREG);

}

*/

while(1) //中断模式下,等待中断的到来

{

if(rec_flag==1) //如果接收中断到来

{

rec_flag=0; //接收标志清零

Uart_char(uartdata); //将接收来的数据发送到串口

}

}

}

/**********************************************

函数原型:void Uart_char(uchar dat)

功 能:将dat数据通过串口传送出去

**********************************************/

void Uart_char(uchar dat)

{

TXREG=dat;//将dat数据存入TXREG

//TXEN=1; //启动发送,TSR开始移位操作。

while (TRMT==0);//判断是否TSR发送完毕,未完等待。

//TXEN=0; //关发送功能,防止TXREG空时,TXIF产生置位

}

/**********************************************

函数原型:void interrupt usart(void)

功 能:串口接收到数据,接受发来的数据将接

收到数据标志位rec_flag置1

**********************************************/

void interrupt usart(void)

{

if(RCIF) //判断是否为串口接收中断

{

rec_flag = 1;

//RCIF=0;

uartdata = RCREG; // 接收数据并存储

//TXREG=recdata ; //把接收到的数据发送回去

}

}

这段程序应该对你有用

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月28日 00:26:50
下一篇 2024年3月28日 00:35:18

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3900
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5600
  • c语言自定义函数数组求和,c语言自定义函数调用数组

    C语言数组怎样求和, 可以通过循环遍历数组中的每个元素,并进行累加。累加的结果可以保存在变量中,需要注意,要保证变量足够保存累加结果,不会出现溢出。 先获取数组长度,然后用for循环,从数组中获取值进行累加求和。 c语言中,定义数组后可以用sizeof命令获得数组的长度(即可容纳元素个数)。但是通过传递数组名参数到子函数中,以获得数组长度是不可行的,因为在子…

    2024年5月23日
    4400
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4400
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4400
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7200
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6300
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4500
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4800
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3400

发表回复

登录后才能评论



关注微信