Serial port 8051与nfc的串行缓冲通信
我有串行通信微控制器8051的问题。我的硬件MCU带有att7035au和模块-1350M CJH NFC读卡器。我已经测试了pc机和mcu的接收和传输与usb ttl/rs232进行得很好。用于成功无误地发送1个字符和长度数据。但是在我尝试在mcu和NFC模块之间进行通信之后,在从NFC接收数据的过程中出现了一个错误。我使用中断来接收数据 例如: mcu发送(十六进制数据): NFC接收数据mcu并发送反馈:Serial port 8051与nfc的串行缓冲通信,serial-port,microcontroller,keil,8051,Serial Port,Microcontroller,Keil,8051,我有串行通信微控制器8051的问题。我的硬件MCU带有att7035au和模块-1350M CJH NFC读卡器。我已经测试了pc机和mcu的接收和传输与usb ttl/rs232进行得很好。用于成功无误地发送1个字符和长度数据。但是在我尝试在mcu和NFC模块之间进行通信之后,在从NFC接收数据的过程中出现了一个错误。我使用中断来接收数据 例如: mcu发送(十六进制数据): NFC接收数据mcu并发送反馈: 02 55 00 02 FF AA mcu从NFC接收数据时应(025500 02
02 55 00 02 FF AA
mcu从NFC接收数据时应(025500 02 FF AA
)已接收
02 55 00 02 FF 05
什么问题?为什么MCU读取接收数据错误
我的代码配置:
BWPR = 0xcf;
BWPR = 0xbc;
PLLCFG = 0x87;
CLKCFG |= 0x04;
EA = 1;
//Serial config 0
SCON0 = 0x50 ; //SCON: serail mode 1, 8-bit UART
PCON|=0x80; //PCON.7 (SMOD) Indicate Baud rate double
SMOD_1=1; //ADCON.7
S0RELL=0xfd; //115200bps
S0RELH=0x03;
TI=0;
RI=0;
ES0 = 1 ;
编辑添加代码中断:
void UART_0(void) interrupt 4
{
if(SCON0&0x01){ //RI=1
SCON0=SCON0&0xfc; //RI=0
card_id[RECE_NUMB]=SBUF0;
if(RECE_NUMB==6){
if(card_id[1]==0x02&&card_id[2]==0x55&&card_id[5]==0xff){
f_ReceiveSucceed=1;
SCON0&=0xef; //disable receive
}
}
++RECE_NUMB;
}
SCON0=0x50;
}
对于主代码(无效):
如果获得接收,则我发送到serialcommunication(),用于使用usb ttl进行监视器数据串行
void SerialCommunication(void){
unsigned char count;
ES0 = 0;
for(count=0;count<=50;count++)
{
SBUF0=card_id[count];
while(TI==0);
TI=0;
}
ES0 = 1;
clear();
SCON0=0x50; //open receive
}
void clear(void)
{
unsigned char r;
for(r=0;r<50;r++){
card_id[r]=0x00;
}
RECE_NUMB=0;
}
void串行通信(void){
无符号字符计数;
ES0=0;
对于(count=0;count您是否使用串行接收缓冲区以及缓冲区的长度?可能需要查看串行中断例程和处理字符的代码以提供更多诊断。感谢@jeff,我使用了很长的缓冲区例如:我将数据字符a发送到Z在MCU和PC之间不是问题(使用usb ttl/rs-232)但是,当使用NFC读卡器时,出现了一个数据错误。我正在添加行代码,您可以在串行通信例程中看到它,您在0处启动串行缓冲区,但是我注意到,在UART\u 0中断例程中,您测试的卡\u id[1]==0x02,我希望该字符位于卡\u id[0]中。我不知道这是否与您的错误有关。我发现配置中断优先级有问题,因为我也设置了其他中断。谢谢您的帮助
while(1)
{
//...
//lines of code to send NFC
//...
if(f_ReceiveSucceed)
{
f_ReceiveSucceed=0;
SerialCommunication();
}
}
void SerialCommunication(void){
unsigned char count;
ES0 = 0;
for(count=0;count<=50;count++)
{
SBUF0=card_id[count];
while(TI==0);
TI=0;
}
ES0 = 1;
clear();
SCON0=0x50; //open receive
}
void clear(void)
{
unsigned char r;
for(r=0;r<50;r++){
card_id[r]=0x00;
}
RECE_NUMB=0;
}