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

C语言变成实现串口收发数据,第1张

#include <reg51.h>

#include <intrins.h>

unsigned char key_s, key_v, tmp

char code str[] = "welcome! www.willar.com \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 = 0i <120i++)

}

}

拓展资料

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

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

二十世纪八十年代,为铅宴了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是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

}

}

}

接收

#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)

}

}

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


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

原文地址: https://outofmemory.cn/yw/12553622.html

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

发表评论

登录后才能评论

评论列表(0条)

保存