单个字符接收没什么问题,多字节接收不行了!比如我要从串口调试助手送出一串字符(AAC234,7568等),单片机接收后存到缓存里?有几个菜的问题先问下:这个字符串是动态的,个数不定,是不是只要将接收数组定义大点就可以,数据处理暂时不管。可以在中断外再处理分离。
代码如下:大家帮我看下这样写可行么,但是显示数码管老不对!
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar stringaz[15];//从串口接收的数据
uchar iaz=0;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
if(RI)
{
RI=0;
for(iaz=0;iaz<15;iaz++)
{
stringaz[iaz]=SBUF;
}
}
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uchar i = 0;
Delay_1ms(100);
Com_Init();
while(1)
{
P0 = table[stringaz[1]];//这样写对不对,测试点亮数码管的,但是显示老不对
P2 = 0x07;//数码管位选
Delay_1ms(10);
}
}
数据接收后依次放入stringaz数组里,在串口调试助手里送1234567等,接收后stringaz[1]是不是应该是第2个数?
stringaz[1]
不知道你传的是什么数据
如果是以十六进制发的1,2,3,啥的,你可以这样直接用作数据的下标
如果是以ASCII码发的,你得把ASCII转成数组下标
通常方法是:ASCII码 - ‘0’
楼你可以把uchar stringaz[15];数组元素个数定义大点就行
P0 = table[stringaz[1]];是显示你接收的第二个数据,前提是发送的是16进制数值。如果是ASCII码,则0~9对应的是32~41,这样你P0 = table[stringaz[1]]的显示就不对了,这个程序是显示一位数字的,而32~41是俩位数,可以改为P0 = table[stringaz[1]-32]就ok了
数组大点可以!
确定理论上stringaz[1]是不确定的,因为你的程序要循环接收15个数,你第一次和第2次第3次发的数后,就会乱掉。例如1次发12个,二次发6个,那么你的stringaz[1]就是第2次的第5个了!
每次发完,确定一个结束标识,才能不乱,例如回车符!
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
if(RI)
{
? RI=0;
? ? ? ? ? ? for(iaz=0;iaz <15;iaz++)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? stringaz[iaz]=SBUF;
? ? ? ? ? ? ? ? }
? }
}
这段程序有问题,每次串行中断接收只有一个字节,存在SBUF中。一个字节怎么可能赋给一个数组
void uart_isr() interrupt 4
{
if(RI)
{
RI = 0;
stringaz[iaz]=SBUF;
iaz++; //iaz=0为全局变量
}
}
试试看
哦凯,谢了各位,学习了不少,自己再琢磨琢磨继续调试!确实看着简单,问题还真多!来者有分!新年快乐各位!