打印
[STM32F1]

STM32103CB 串口智能卡接口问题

[复制链接]
1909|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cosxpeach|  楼主 | 2014-1-9 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
香主,我在使用STM32103CB 串口智能卡接口时,发现一个问题,在对SAM 卡发送指令后,串口在接收SAM卡返回的数据时,在正常返回的数据前多一个字节。现在我处理是在接收的时候丢掉第一个字节。但现在又出现新的问题,在对SAM 卡发送指令后,串口会在正常数据前多收2个字节,并且我打印了这2个字节,是我发给SAM卡的指令后2字节。
下面是我的接收跟发送代码:
/*发送一个字节数据*/
  void SendByte(int socket,uint8 SendData)
{   
unsigned long timeout = 0;
if(socket==0){
  USART_SendData(SMART_COM2,SendData);
  Delayus(5);
  while(USART_GetFlagStatus(SMART_COM2, USART_FLAG_TXE) == RESET)
  {
   Delayus(1);
   if(timeout++>60000) return ;
  }
}
else
{
  USART_SendData(SMART_COM3,SendData);
  //Delayus(2);
  while(USART_GetFlagStatus(SMART_COM3, USART_FLAG_TXE) == RESET)
  {
   Delayus(1);
   if(timeout++>60000) return ;
  }
}
}  
/*接收一个字节数据*/
uint8 GetByte(int socket,uint8* GetData)
{      
unsigned long timeout = 0;
if(socket==0){
  while(USART_GetFlagStatus(SMART_COM2, USART_FLAG_RXNE) == RESET)
  {
   Delayus(1);
   if(timeout++>300000) return 0x01;//超时时间要长去接收第一个字节。
  }
  *GetData = USART_ReceiveData(SMART_COM2);
  //sprintf(msg,"%02x",*GetData);
  //debug_printf(msg);
  return 0;//收到数据
}
else
{
  while(USART_GetFlagStatus(SMART_COM3, USART_FLAG_RXNE) == RESET)
  {
   Delayus(1);
   if(timeout++>300000) return 0x01;//超时时间要长去接收第一个字节。
  }
  *GetData = USART_ReceiveData(SMART_COM3);
  //sprintf(msg,"%02x",*GetData);
  //debug_printf(msg);
  return 0;//收到数据
}
}

char UsartSendNbyte(int socket,unsigned int len,unsigned char *buff)
{
unsigned int i;
//printk("usart_sendNbyte:\n");
for(i=0;i<len;i++){
  SendByte(socket,buff[i]);
  ///printk("%02x",buff[i]);
}
//printk("\n");
//usart_send('0');
return 0;
}
char UsartRecvNbyte(int socket,unsigned long len,unsigned char *byte)
{
unsigned long i;
for(i=0;i<len;i++){
   if(GetByte(socket,&byte[i]))    return 0x01;
}
return  0x00;
}
帮看看为什么会出现这个问题。
另:我的SAM 卡跟何SMT32之间没有加SAM 卡专用芯片8024.
沙发
cosxpeach|  楼主 | 2014-1-17 15:34 | 只看该作者
没有人做这个部分吗?

使用特权

评论回复
板凳
airwill| | 2014-1-18 16:28 | 只看该作者
呵呵, 发送命令后, 检查一下 TXE, 然后再转入接收, 这是发送缓冲区引起的

使用特权

评论回复
地板
cosxpeach|  楼主 | 2014-1-20 08:49 | 只看该作者
我的发送完成有做TXE判断。
void SendByte(int socket,uint8 SendData)
{   
unsigned long timeout = 0;
if(socket==0){
  USART_SendData(SMART_COM2,SendData);
  Delayus(5);
  while(USART_GetFlagStatus(SMART_COM2, USART_FLAG_TXE) == RESET)
  {
   Delayus(1);
   if(timeout++>60000) return ;
  }
}

使用特权

评论回复
5
cosxpeach|  楼主 | 2014-1-21 10:49 | 只看该作者
问题解决了,STM32在用智能卡模式时,要注意用USART_FLAG_TC做发送完标志,
然后初始化串口的时候要将保护时间设短,不然会丢失过程字节。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

54

帖子

1

粉丝