我用单片机接收一个数据例如是十六进制的123A,我接收的数据格式是什么那
我从缓存sbuf读出的是什么呀,我想存成data[]={1,2,3,A},该怎么接收啊?
我用
for (i=0,i<4,i++)
{data=sbuf0;}
可以吗?
请指点谢谢了
首先要用中断或者查询的方式从串口接收到正确的数据
然后再根据需要进行转换
看你的描述,应该是HEX到ASCII的转换
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
while (!RI) ; // 等待字节收到
RI = 0;
data=sbuf0;
}
[quote]引用 10 楼 kelibin 的回复:
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了
引用: 引用 11 楼 aaquan66 的回复:
[quote]引用 10 楼 kelibin 的回复:
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了
超时判断就是防止没收到字符的时候一直在等待,程序就死在那里了。
---->>while (!RI) ; // 等待字节收到 <<----
哦
您的意思是我这加个时间判断程序
例如如果10ms没有接收到数据怎么处理时这个意识吗
我加到到---->>while (!RI) ;
下面是吗?
还想请教
我想程序开始运行时先接受数据,接收到后我要按照接收到得数据控制多路开关的闭合,然后采集信号,最后通过串口把采集到得信号发射出去,
想请教我的接收数据和处理多路开关的程序一起写到中断程序里那
还是只把接收写到中断程序,把控制多路开关的写到主程序里
还有我怎么保证让程序初始化后就等待接收数据,接收完了才进行采集信号的操作啊
谢谢了
刚入门不太明白
请高人指点
[quote]引用 14 楼 onesyu 的回复:
中断一次接收一字节
[/Quote
中断一次全部接受可以吗
楼主那个data[]没定义类型啊,应该定义为unsigned short
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=SBUF0;
}
}
BZ=1;
//LED=1;
}
void serial_send(void)
{
char i;
for(i=0; i < k; i++)
{
temp_uchar = temp_data;
SBUF0 = temp_uchar;
while(!TI0);
TI0=0;
}
}