51单片机串口接收问题请教

aaquan66 2009-08-05 01:44:44
我用单片机接收一个数据例如是十六进制的123A,我接收的数据格式是什么那
我从缓存sbuf读出的是什么呀,我想存成data[]={1,2,3,A},该怎么接收啊?
我用
for (i=0,i<4,i++)
{data[i]=sbuf0;}
可以吗?
请指点谢谢了
...全文
580 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic_mn2 2009-08-29
  • 打赏
  • 举报
回复
强制转换吗?
aaquan66 2009-08-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 andyleeleelee 的回复:]
可以将接收到的字符转换成字符型,再存起来
[/Quote]
怎么转换啊
可以具体点吗
谢谢了
aaquan66 2009-08-27
  • 打赏
  • 举报
回复
上面这个程序出不来结果
帮忙看一下
谢谢了呀
aaquan66 2009-08-27
  • 打赏
  • 举报
回复
int n, m, k,i;
int x,BZ,j;
unsigned char serial_data[30];
unsigned char temp_data[];
unsigned char temp_uchar;
unsigned char kg_data[20];

sbit LED = P0^1;





//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {

PCA0MD &= ~0x40; // WDTE = 0 (disable watchdog timer)
m = 0;
k = 0;
x = 0;
BZ=0;




EA = 1;



Init_Device(); //功能初始化
UART0_initial();

LED=1;
while(1)
{
// LED=1;
while (BZ==11)
{
ES0 = 0;
BZ = 0;
LED=1;
//delay (1000);

//UART0_initial();
serial_send(); //从串口发送数据

}

}

}

// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Oscillator_Init() //24.5M
{
OSCICN = 0x83;
RSTSRC = 0x04;

}


void UART0_initial(void)
{

SCON0=0X50;
TMOD |= 0x20;

TL1 = 0xB0;//波特率:19200;系统时钟=24.5M;参见F350中文文档191页
TH1 = 0x60;//波特率:19200
CKCON |= 0x01;//T0使用系统时钟/4=24.5M/4;参见F350中文文档167页
ES0=1;
TR1 = 1;
}





void Port_IO_Init()
{
// P0.0 - Skipped, Open-Drain, Digital
// P0.1 - Unassigned, Push-Pull, Digital //控制LED
// P0.2 - Unassigned, Open-Drain, Digital //连接WR
// P0.3 - Unassigned, Open-Drain, Digital //连接DATA
// P0.4 - TX0 (UART0), Open-Drain, Digital
// P0.5 - RX0 (UART0), Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital

// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital

P0MDOUT = 0x12; // 使能P0.1为推挽输出
P0MDIN |= 0x01;
P0SKIP = 0x0F;
XBR0 = 0x01;
XBR1 = 0x40;
LED = 0;
}

void Interrupts_Init()
{
IT01CF = 0x0A; //Assign INT0 to P0.2
EX0 = 1; //Enable /INT0 interrupts
ET2 = 1; //Enable TIMER2 interrupts
ET0 = 1; //Enable TIMER1 interrupts
ES0 =1;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
//Timer_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}

/* UART0 中断接收子程序*/
void UART0_ISR(void)interrupt 4
{
//char kai;
char i;
for(i=0;i<4;i++)
{
while (!RI0)
{RI0=0;
//kai=SBUF0;
temp_data[i]=SBUF0;

}

}
BZ=1;
//LED=1;
}


void serial_send(void)
{
char i;

for(i=0; i < k; i++)
{
temp_uchar = temp_data[i];
SBUF0 = temp_uchar;
while(!TI0);
TI0=0;
}

}
富贵666 2009-08-27
  • 打赏
  • 举报
回复
可以将接收到的字符转换成字符型,再存起来
空影 2009-08-23
  • 打赏
  • 举报
回复
楼主那个data[]没定义类型啊,应该定义为unsigned short
贝隆 2009-08-23
  • 打赏
  • 举报
回复
顶,
谁的谁心疼 2009-08-18
  • 打赏
  • 举报
回复
二楼正解
aaquan66 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 onesyu 的回复:]
中断一次接收一字节
[/Quote
中断一次全部接受可以吗
onesyu 2009-08-14
  • 打赏
  • 举报
回复
中断一次接收一字节
aaquan66 2009-08-11
  • 打赏
  • 举报
回复

您的意思是我这加个时间判断程序
例如如果10ms没有接收到数据怎么处理时这个意识吗
我加到到---->>while (!RI) ;
下面是吗?
还想请教
我想程序开始运行时先接受数据,接收到后我要按照接收到得数据控制多路开关的闭合,然后采集信号,最后通过串口把采集到得信号发射出去,
想请教我的接收数据和处理多路开关的程序一起写到中断程序里那
还是只把接收写到中断程序,把控制多路开关的写到主程序里
还有我怎么保证让程序初始化后就等待接收数据,接收完了才进行采集信号的操作啊
谢谢了
刚入门不太明白
请高人指点
lin0119 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 aaquan66 的回复:]
[Quote=引用 10 楼 kelibin 的回复:]
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了
[/Quote]

超时判断就是防止没收到字符的时候一直在等待,程序就死在那里了。
---->>while (!RI) ; // 等待字节收到 <<----
Kelibin 2009-08-10
  • 打赏
  • 举报
回复
少了超时判断。。
aaquan66 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kelibin 的回复:]
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了
javajlu 2009-08-09
  • 打赏
  • 举报
回复

[Quote=引用 5 楼 great_bug 的回复:]
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
  while (!RI) ; // 等待字节收到
  RI = 0;
  data[i]=sbuf0;
}

[/Quote]
aaquan66 2009-08-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 great_bug 的回复:]
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
  while (!RI) ; // 等待字节收到
  RI = 0;
  data[i]=sbuf0;
}

[/Quote]谢谢了
我调试一下试试
Great_Bug 2009-08-06
  • 打赏
  • 举报
回复
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
while (!RI) ; // 等待字节收到
RI = 0;
data[i]=sbuf0;
}
sdx001 2009-08-06
  • 打赏
  • 举报
回复
..............xuexi
cellsplinterqwe 2009-08-06
  • 打赏
  • 举报
回复
恩有道理
aaquan66 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 arnold9009 的回复:]
首先要用中断或者查询的方式从串口接收到正确的数据
然后再根据需要进行转换

看你的描述,应该是HEX到ASCII的转换
[/Quote]
也想听听详细的解释
谢谢了
加载更多回复(3)

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧