关于单片机串口通信发送字符串问题
时间:10-02
整理:3721RD
点击:
-
- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #include"delay.h"
- #include<stdio.h>
- /*------------------------------------------------
- 硬件端口定义
- ------------------------------------------------*/
- unsigned char rev[12];
- unsigned char ser_rev;
- unsigned char count=0;
- bit flag;
- /*------------------------------------------------
- 函数声明
- ------------------------------------------------*/
- void SendStr(unsigned char *s);
- /*------------------------------------------------
- 串口初始化
- ------------------------------------------------*/
- void InitUART (void)
- {
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
- TH1 = 0xfd; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
- TL1=0xfd;
- TR1 = 1; // TR1: timer 1 打开
- REN=1;
- SM0=0;
- SM1=1;
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- }
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- void main (void)
- {
- InitUART();
- while (1)
- {
- if(flag==1)
- {
- ES=0;
- SendStr(rev);
-
-
- flag=0;
- ES=1;
- }
- }
- }
- /*------------------------------------------------
- 发送一个字节
- ------------------------------------------------*/
- void SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- /*------------------------------------------------
- 发送一个字符串
- ------------------------------------------------*/
- void SendStr(unsigned char *s)
- {
- while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
- {
- SendByte(*s);
- s++;
- }
- }
- void ser() interrupt 4
- {
- if(RI)
- {
-
-
- RI=0;
- if(count<=11)
- {
- ser_rev=SBUF;
- rev[count]=ser_rev;
- count++;
- }
- else
- {
- count=0;
- flag=1;
- }
-
- }
- }
波特率对吗?
波特率应该没问题 我22.1184M 波特率19200,应该还是程序问题
跪求大神啊!
参考一下这个吧 http://bbs.21ic.com/icview-377947-3-1.html 48楼
说实话我也在写一个这样的程序,很遗憾没有看懂。
在初始化里面对TI = 0;
字符数组赋值 和字符串赋值是不同的,字符数组赋值没有自动的'\0',
发送字符串时,串口助手会在字符串后面自动发送'\0'?而数组赋值没有?
这个问题我昨天晚上弄了两三个钟也没有弄出来。但是有一点提醒一下小编。
- if(count<=11)
- {
- ser_rev=SBUF;
- rev[count]=ser_rev;
- count++;
- }
- else
- {
- count=0;
- flag=1;
- }
你的这段代码是有问题的。他接收到12个字符的时候else里面的语句还有没执行。他要等到下一次接收到字符的时候,就是接收到第13个字符的时候才执行else里面的数据。小编可以参考六楼的回复。如果他后面没有自动发送'\0',则要等到下一次串口助手下一次发送字符串的时候才能接受到第13个字符。
谢谢各位的细心解答 我今天在回去理一下思路
不会啊 我说的是他的定义 数组总长度12 接受数据12个 要是12个数据里面 没有0 不就溢出了
我看了下你说的那个帖子 发现他接受部分最后一位是有结束标志'\0'的 ,我的程序里没有,不知道是不是这个原因
我看了下你说的那个帖子 发现他接受部分最后一位是有结束标志'\0'的 ,我的程序里没有,不知道是不是这个原因
把你写的程序也贴上来看看啊 ,我发现串口问题还是有很多人提的,说明还是有一定难度的,真希望有大神能详细的讲讲哦
- //123456789ab# 第一次输出可能有问题,之后就是正常的 123456789ab
- //123456789a# 输出应该没有问题
- #include<reg52.h>
- #include<stdio.h>
- /*------------------------------------------------
- 硬件端口定义
- ------------------------------------------------*/
- unsigned char rev[12];
- unsigned char ser_rev;
- unsigned char count=0;
- bit flag;
- /*------------------------------------------------
- 函数声明
- ------------------------------------------------*/
- void SendStr(unsigned char *s);
- /*
- void InitArray()
- {
- unsigned char len;
- for(len=0;len<12;len++)
- {
- rev[len]='\0';
- delay1ms();
- }
- }
- */
- /*------------------------------------------------
- 串口初始化
- ------------------------------------------------*/
- void InitUART (void)
- {
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
- TH1 = 0xfd; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
- TL1=0xfd;
- TR1 = 1; // TR1: timer 1 打开
- REN=1;
- SM0=0;
- SM1=1;
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- }
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- void main (void)
- {
- InitUART();
- while (1)
- {
- if(flag==1)
- {
- ES=0;
- SendStr(rev);
- flag=0;
- ES=1;
- }
- }
- }
- /*------------------------------------------------
- 发送一个字节
- ------------------------------------------------*/
- void SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- /*------------------------------------------------
- 发送一个字符串
- ------------------------------------------------*/
- void SendStr(unsigned char *s)
- {
- while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
- {
- SendByte(*s);
- s++;
- }
- }
- void ser() interrupt 4
- {
- if(RI)
- {
- RI=0;
- if(count<11)
- {
- count++;
- ser_rev=SBUF;
- rev[count-1]=ser_rev;
- if(ser_rev=='#')
- {
- rev[count-1]='\0';
- count=0;
- flag=1;
- }
- }
- else
- {
- count=0;
- flag=1;
- }
- }
- }
谢谢 我回去试试你改动的程序
我是一个初学者,如果发送的字符长度不确定也可以吗?
不错。值得学习!
想问下问题解决了吗?