串口通信上位机怎么收不到数据啊

2019-03-24 13:06发布

#include "include.h"
#include "msp430x14x.h"
#include "string.h"
#define nData 10
unsigned char nRxBuff = 0;
unsigned char buf[60];
unsigned char cBuf[20];
signed char RXTXstate;         //发送数据计数
unsigned char flags;             //标志
unsigned char RXErrorFlag;
unsigned char RXflag;             //缓存中数据指示
unsigned char i_reg;             //中断寄存器
unsigned char UID[8];             //UID
unsigned char UU[40];
unsigned char Data[50];
unsigned char CollPoss;
unsigned char RevBuffer[20];      //接收到个数据
unsigned char Rbuf[30];
unsigned char IDA[5];
//unsigned char CmdValid=0;
unsigned char   ID=0;  // ID=1 读到 15693卡 UID  ID=2读到14443A卡UID
volatile unsigned char IRQ_Status;

unsigned char POLLING;
extern void putstr(unsigned char ch[],unsigned char length);
void delay(int n);  
//-----------------------------------------------------
void delay(int n)   
{
   while(n--);
}
//延时1毫秒
void DelayMs(unsigned int n_ms)
{
    unsigned int i ;
    while(n_ms --)
    {
        for(i=0x2ee;i>0;i--);
    }   
}
void delay_ms(unsigned int n_ms) {
    unsigned int ii1, ii0;
    for(ii0=n_ms; ii0>0; ii0--) {
        ii1 = 0x07FF;                    // Delay
        do (ii1--);
        while (ii1 != 0);
    }
}
//************************************************************
// 异步串行通信
// 功能描述 : SCI初始化函数
// 输入参数 : 无
// 返回参数 : 无
// 说    明 :
//************************************************************
void Init_Sci(void)
{  
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 32k/9600 - 3.41
  UBR10 = 0x00;                             //
  UMCTL0 = 0x4A;                            // Modulation
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                           // Enable USART0 RX interrupt
  
}
//定时器A
void CounterSet(void)
{
    TACTL |= TASSEL_2 + ID1 + ID0 + TACLR;          //SMCLK, div 8, interrupt enable, timer stoped   
    TAR = 0;
    TACCTL0 |= CCIE;                                //compare interrupt enable   
    TACTL &= ~TACLR;                                //reset the timerA
}
//*************************************************************
// 功能描述 : 获得一个字符
// 输入参数 : 无
// 返回参数 : 一个字符
// 说    明 :
//*************************************************************
unsigned char uart_getchar(void)
{  
   while (!(IFG1 & URXIFG0));                // USART0 TX buffer ready?
   
   return RXBUF0;
}
//*************************************************************
// 功能描述 : 发送一字节函数
// 输入参数 : 字符
// 返回参数 : 无
// 说    明 :
//*************************************************************
void uart_putchar(unsigned char ch)
{   
     while((IFG1 & UTXIFG0)==0);//USART1 TX buffer ready?保证发送缓存为0
     TXBUF0=ch;
}
//**************************************************************
// 功能描述 : 发送字符串函数
// 输入参数 : 字符数组
// 返回参数 : 无
// 说    明 :
//**************************************************************
void putstr(unsigned char ch[],unsigned char length)
{
  unsigned char i;
  for(i=0;i<length;i++)
  {   
     uart_putchar(ch);
  }     
}
void send_cstring(unsigned char *pstr)
{
while(*pstr != '')
{
   uart_putchar(*pstr++);
}
}

//****************************************************************
// 功能描述 : 系统主循环函数
// 输入参数 : 无
// 返回参数 : 无
// 说    明 :
//****************************************************************
void main(void)
{
    unsigned char command[4];
    volatile unsigned int i=0;
  //unsigned char command[12];  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P6OUT = 0xff;                           
  P6DIR = 0Xff; //LED,设置P6为输出
  LED2ON;   //LED2ON    P6OUT &= ~BIT6
  do
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
    BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2 (safe)
    IRQ_Status = 0;
    Init_Sci();            //串口初始化
    InitPort();            //端口设置
    Initial7960s();        //初始化7960  
    delay(20);
     BCSCTL1 &= ~XT2OFF;  // XT2on 开启高速晶体振荡器  
    _EINT();       //开启总中断
  while(1)
  {  
    FindTag(0x00);
     _BIS_SR(LPM3_bits+GIE);//Enter LPM3 w/interrupt
    DelayMs(25);
    if(RXflag==1)
   {
        RXflag=0;
      
    /*if(RXflag==1)
   {
      RXflag=0;
      putstr(RevBuffer,15);
   
    }*/
   
      if(1==ID)                   //15693
      {  
     command[0] = ChipStateControl;     // 打开 RF 发射和接收
     command[1] = 0x21;                 // RFID模块RF场始能,接收始能
     command[2] = ISOControl;         // ISO15693
   
        switch(RevBuffer[0])//默认为15693协议
      {
      case 0x01:          //寻卡
      case 0x24:          //写多重块
      case 0x26:          //重起准备
      case 0x27:          //写AFI
      case 0x29:          //写DSFID           
      case 0x2B:          //获得系统信息
      case 0x2C:          //获得多重块安全状态
        command[3] = 0x02;                      // ISO15693 高速, 单载波, 4出1
        break;
      case 0x20:          //读单一块
        command[3] = 0x01;                      // ISO15693 低速, 单载波, 256出1
       break;
      case 0x21:          //写单一块
      case 0x23:          //读多重块
        command[3] = 0x03;                     // ISO15693 高速, 单载波, 256出1
        break;
      }
      WriteSingle(command, 4);      
      DelayMs(5);
     DirectCommand(&RevBuffer[0]);   //直接写15693协议
      switch(RevBuffer[0])
      {
      case 0x01:        //写命令的时候是0X01
          flags = 0x06;
          ReadUID();
          GetUID();
          putstr(UID,8);      
          break;
     
      case 0x20://读单块,写命令的格式是:20 起始块,最好能够写到6个字节,便于下一次写入命令
        switch(RevBuffer[2])
        {
        case 0x00:
          ReadSingleBlock(RevBuffer[1]);
        break;
        case 0x01:
          ReadSingleBlockWithAdd(RevBuffer[1]);
          break;
        }   
        putstr(Data,4);      
        break;
      case 0x21://写单块,写命令的格式是:21 起始块 数据,总共6个字节
           WriteSingleBlock(RevBuffer[1]);
           putstr("1111",4);
        break;
      case 0x23://读两块,写命令的格式是:23 起始块 块的数量,最好能够写6个字节,便于下一次写入命令,
        //FIFO为12个字节,所以每次最多读两块,即8个字节
        ReadMultipleBlock(RevBuffer[1],RevBuffer[2]);//Bsize为1,表示读两块,即读的块数是(Bsize+1)
        putstr(Data,(RevBuffer[2])*4);  
        break;
      case 0x24://写多块,写命令的格式是:24 起始块 块的数量
        WriteMultipleBlock(RevBuffer[1],RevBuffer[2]);
        putstr("88888888",8);
        break;
      case 0x26://复位准备
        ResetToReday();
        putstr("98979561",8);
        break;
      case 0x27://写AFI,应用族识别符,应用的卡预选准则
        //命令格式为:27 AFI
        WriteAFI(RevBuffer[1]);
        putstr("RevBuffer[1]",4);
        break;
      case 0x29://写DSFID,DSFID指明了应答器存储的数据结构
        //命令格式为:29 DSFID
        WriteDSFID(RevBuffer[1]);
       putstr("RevBuffer[1]",4);
        break;
      case 0x2B://获取系统信息,返回值的格式说明:
        //00 = no error,
        //0F=Tag reference field present,Tag memory field present,Tag AFI field present,Tag DSFID field present
        //6EADD606000007E0   :  Reverse byte ordered.Normal UID byte order is EO 07 00 00 06 D6 AD 6E.
        //19 :  Data Storage Format ID
        //33 :  AFI
        //3F 03 88 :  3F meaning number of blocks = 64,03 meaning block size = 32 bits,8F defined by tag manufacturer
        GetSystemInfo();
        putstr(Data,15);
        break;
      case 0x2C:
        //命令格式是:2c 起始块 块的大小
        //获得多块的安全状态,返回值格式说明
        //00 :00 no tag error,
        //00 : 00 security status of block number 00 (block #1),
        //00 : 00 security status of block number 01 (block #2),
        GetMult_BlkSelStatus(RevBuffer[1],RevBuffer[2]);
        putstr(Data,RevBuffer[2]+1);
        
        break;
      /*default:
       putstr("0123456789",10);
       break;*/
      }
      }
    /* for(i=0;i<8;i++)
        uart_putchar(UID);
        ID=0;*/
  
      command[0] = ChipStateControl; // 关闭RF 发射和接收
      command[1] = 0x01;              // RFID模块RF场关闭,接收关闭
      WriteSingle(command, 2);      
      DelayMs(5);
      
      command[0] = IRQStatus;
      ReadSingle(command, 1);         // 清除 IRQs
      DelayMs(5);
   
   
   }  
     if(2==ID)                   //14443A
      {   
          //uart_putchar(0x07);
          //uart_putchar(0x02);
        InitialSettings();//14443A初始化设置
        FindTags(0x00);
        ID=0;
      }
}
   

}

//**********************************************************************************
// 功能描述 : 接收中断服务程序
// 输入参数 : 无
// 返回参数 : 无
//**********************************************************************************
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAhandler(void)
{
    unsigned char Register;
    stopCounter;                                    // 停止接收超时定时器
    irqCLR; // 清除中断标志
    Register = IRQStatus;                     // IRQ 状态地址
    ReadSingle(&Register, 1);                     //读状态IRQ状态寄存器
    Register = Register & 0xF7;                     //消除奇偶位
    if(Register == 0x00)
    {
        i_reg = 0x00;                               // 无任何中断,接收超时
    }
    else
    {
        i_reg = 0x01;                               // 如果有中断发生, 但是已经清除了PORT2的IRQ中断标志,发送: 发送还没有结束
    }   
    LPM0_EXIT;
}


#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
   _BIC_SR_IRQ(LPM3_bits);//Clear LPM3 bits
if(nRxBuff<=15)
  {
    RXflag=1;
    RevBuffer[nRxBuff] = RXBUF0;
//   TXBUF0=RevBuffer[nRxBuff];
        nRxBuff++;
     if(nRxBuff==15)
          nRxBuff=0;
  }
     
}

//**********************************************************************************
// 功能描述 : IRQ中断服务程序
// 输入参数 : 无
// 返回参数 : 无
//**********************************************************************************
#pragma vector = PORT2_VECTOR
__interrupt void IRQ(void)   
{
    unsigned char Register[1];
    stopCounter;      // 停止超时计数器
    do
    {
        irqCLR;       //PORT2 interrupt flag clear
        Register[0] = IRQStatus;   
        ReadSingle(Register, 1);     // 读IRQ状态寄存器
        if(*Register == 0xA0)                       // TX active and only 3 bytes left in FIFO  
        {
            goto FINISH;
        }
        InterruptHandlerReader(&Register[0]);
    } while((irqPORT & irqPIN) == irqPIN);
FINISH:
    LPM0_EXIT;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
lr2131
2019-03-24 16:47
< :TI_MSP430_内容页_SA7 --> 我今天刚解决了这样的问题,LZ可以先把上位机的RX和TX短接,做一下回环测试,这样先可以检查一下你上位机的代码是不是有问题,然后用同样的方法回环下位机,再测试你下位机有没有问题。都没有问题了,上位机用串口调试工具来替代你上位机的程序和下位机对接,看能不能通过,这样可以测试你的通信设置和硬件问题,如果都通过了,再把你上位机和下位机的对接,如果不通,那一定是设置有问题,再调试一下。

一周热门 更多>

相关问题

    相关文章