您好,
我有一个通过UART将AT命令发送到sigfox模块TD1208的代码,它工作正常(或者我想是这样)。 我重新获取了代码以将其集成到更复杂的程序中,但在测试之前,它无法正常工作。 向TD1208模块发送AT命令是正确的,它会正确执行这些命令。 问题是我需要查看模块响应,但我没有收到,'USGI0RX_ISR'从未执行。 我用launchpad进行测试,RX和TX引脚转90º。 我附上了代码。 提前感谢。
#include <msp430g2553.h>
#include "string.h"
#define STRSIGFOXLENGHT 350
#define LED BIT0
#define RXD BITS1
#define TXD BIX2
volatile unsigned int txFlag; // txFlag的邮箱标志。
volatile unsigned char txChar; //此字符是进入UART
volatile unsigned int rxFlag的最新字符; // rxFlag的邮箱标志。
volatile unsigned char rxChar; //此char是UART
字符strSigfox[STRSIGFOXLENGHT],
void uartInit(void),
unsigned char uartReadChar(),
void uartWriteChar(unsigned char c),
void uartReadString(char* Array, int length, char* pattern, int patternLength);
void uartWriteString(car *str);
int main(void){
WDTCTL = WDTPW + WDTHOLD; //停止WDT
BCSCTL1 = CALC1_1MHz; //将DCO设置为1MHz
DCOCTL = CALDCO_1MHz; //将DCO设置为1MHz
uartInit(); //初始化UART连接
__enable_interrupit(); //已启用中断
Memset (strSigfox,'\0',STRSIGFOXLENGHT);
//uartWriteString (((char *)"at$SS=4.0628万f5c427ee148\n\n");
uartWriteString ((char *)"at\n\r");
uartReadString (strSigfox,STRSIGFOXLENGHT,(char *)"确定",2);
uartWriteString ((char *)"\n\r\n\r\n\r");
uartWriteString(strSigfox);
}
void uartInit(void){
P1SEL = RXD + TXD; //设置I/O
P1SEL2 = RXD + TXD;
P1DIR || LED; //WFP 1.0 红色LED。 在收到CHAR时切换。
P1OUT &=~LED; //LED熄灭
UCA0CTL1 || UCSSEL_2;
UCA0BR0 = 104;
UCA0BR1 = 0;
UCA0MCTL = 0x10|UCBRS0;
UCA0CTL1 &=~UCSWRST; //USCI状态机
IE2 |= UCA0RXIE; //启用USI_A0 RX中断
rxFlag =0; //将rxFlag设置为0
txFlag =0; //将txFlag设置为0
return;
}
unsigned char uartReadChar() //等待UART
{
IE2 |= UCA0RXIE;
while (rxFlag == 0); //等待设置Rx_flag
rxFlag =0; //ACK Rx_flag
返回rxChar;
}
void uartReadString(Char* Array, int length,char* pattern,int patternLength)
{
无符号int i =0;
while ((i < length))(((I <长度) //抓取数据,直到数组填充
{
array[i]= uartReadChar();
IF (模式长度>=1){
IF((Array[i]== pattern[1])&&(Array[i-1]== pattern[0])) //如果我们收到一个\r主机要结束
{
I++;
for (; i < length ; i++)(对于(; i <长度; i++)) //用\0 nul填充字符串的其余部分。 用\0覆盖\r
{
array[i]='\0';
}
中断;
}
I++;
}
return;
}
void uartWriteChar(unsigned char c)
{
txChar = c; //将char放入TX_char中
IE2 |= UCA0TXIE; //启用USI_A0 TX中断
while (txFlag == 1); //必须等待TX缓冲区
txFlag =1; //重置TX_FLAG
return;
}
void uartWriteString(car *str) //向UART发送字符串。
{
while (* str) uartWriteChar(*str++); //通过字符串前进到结尾
return;
}
#pragma vector = USCIAB0TX_vector //UART TX USCI中断
__interrupt void USCI0TX_ISR(void){
UCA0TXBUF = txChar; //将字符复制到TX缓冲区
txFlag =0; //ACK TX_FLAG
IE2 &=~UCA0TXIE; //关闭中断以保存CPU
}
#pragma vector = USCIAB0RX_vector //UART RX USCI中断。 这在USCI收到CHAR时触发。
__interrupt void USCI0RX_ISR(void)
{
rxChar = UCA0RXBUF; //从RX缓冲区复制,在执行此操作时,我们也确认中断
rxFlag =1; //将Rx_flag设置为1
IE2 &=~UCA0TXIE;
P1OUT ^= LED; //通过切换LED
来通知我们收到了字符}
此致,
Fran Martín ć。