This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2311:通过 UART 发送二进制数据

Guru**** 2548010 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/589534/msp430fr2311-sending-binary-data-through-uart

器件型号:MSP430FR2311

您好!

我正在通过 UART 发送二进制数据、我将无符号整数作为2 8位值发送、因为 TX 缓冲区只有8位。 如何在没有空格的情况下发送这两个值。 我正在使用 RealTerm 串行监视器查看二进制数据、但通过 UART 发送的每一个数据都由空格隔开。 2 8位值之间不能有空格。 在第93行和第95行、我将发送16位整数值作为2 8位值。  

/*以下代码处理并通过 UART 发送从 MSP430模拟引脚读取的传感器值。 //

//运行
#include 的代码所需的文件 
#include 
#include 
#include 
#include 

//声明全局变量
unsigned int adc_result[number_sensors]; //10位 ADC 转换结果数组
uint8_t ADCSensorType[8]; //存储传感器类型
的数组 uint8_t idx = 0; //8位索引
无符号内部通道 Open = NUMBER_SENSORS - 1; //用于迭代 ADC_Result 数组
unsigned int k;
unsigned int m;

void init_uart (); //初始化 UART 串行通信
void init_adc(); //Utilize ADC
void UARTSendArray(); //用于发送传感器值和索引
字符*itoa (unsigned int n)的函数; //函数将整数转换为字符数组
void UARTSendData (int cnt); //发送传感器数据的函数
void transmit 数据(); //function to intiate we svoid
sendSensorID(); //在 idx 复位

int main (void)
{时发送 sensorID 的函数
WDTCTL = WDTPW | WDTHOLD; //停止 WDT

对于(m = 0;m<8;m++){
if (ADCSensorID[m]!= NULL){
ADCSensorType[m]= ADCSensorID[m]>5;
}
}

init_uart(); //初始化 UART 串行通信
init_adc(); //初始化 ADC

while (1)
{
while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
ADCCTL0 |= ADCENC | ADCSC; //采样和转换开始
_bis_SR_register (LPM0_bits | GIE); //Enter LPM0并启用中断
while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态

sendSensorID();

UARTSendArray();

IDx = idx + 1;
__DELAY_CYCLES (5000);
}
}


void sendSensorID(){
if (idx = 0x0){
UCA0TXBUF = 0xF600 >> 8 & 0xFF; //传感器 ID 的标头:11110110
对于(m = 0;m<8;m++){
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = ADCSensorType[m];
}
}


空 UARTSendArray(){

while (!(UCA0IFG & UCTXIFG)); //等待 USCI_A0 TX 缓冲器准备就绪

Transmit 数据(); //每个数据包的标头

UCA0TXBUF = idx; //发送索引

对于(k = 0;k < NUMBER_SENSORS;k++){ //发送模拟值
UARTSendData (k);
}

}

//此函数在每个数据包
void transmit 数据()之前发送
//二进制值0xD666为11110110 01101110,十进制值63086 (不应出现)
UCA0TXBUF = 0xF66E >> 8和0xFF;
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = 0xF66E & 0xFF;
while (!(UCA0IFG & UCTXIFG));
}


//发送传感器值
void UARTSendData (int cnt){
if (ADCSensorType[cnt]== 0x0000){
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = ADC_RESULT[cnt]>>8和0xFF;
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = ADC_RESULT[cnt]& 0xFF;
}
否则、如果(ADCSensorType[cnt]=0x0001){
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = ADC_RESULT[cnt]>>8和0xFF;
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = ADC_RESULT[cnt]& 0xFF;
}
}


char * itoa (unsigned int n){
字符 s[16];
静态字符 RV[16];
int i = 0、j;
//从最低有效开始一次弹出一个十进制值
执行{
S[i++]="0"+ n%10;
n /= 10;
}
while (n > 0);
//数字将按相反顺序排列
对于(j = 0;j < I;j++) RV[j]= s[i-j-1];
RV[j]='\0';
返回 RV;
}

void init_adc(){
//配置 ADC A0~Number_sensors 引脚
P1SEL0 |=数字传感器;
P1SEL1 |=数字传感器;

//禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

//配置 ADC
ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON; //16ADCclks、MSC、ADC 打开
ADCCTL1 |= ADCSHP | ADCCONSEQ_1 | ADCSSEL_1; //ADC 时钟 ACLK、采样计时器、s/w trig、通道序列被转换一次
ADCCTL2 |= ADCRES_1; //10位转换结果
ADCMCTL0 |=(NUMBER_SENSORS - 0x0001)| ADCSREF_0; //A0 --> A (number_sensors);Vref=AVCC 和 AVSS
ADCIE |= ADCIE0; //启用 ADC 转换完成中断

//配置引用
PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
PMMCTL2 |= INTREFEN; //启用内部基准
_DELAY_CYCLES (400); 基准稳定的//延迟
__no_operation();
}//Utilizes

the UART on Pin 1.6 and 1.7
void init_uart()
{
//配置 UART 引脚
P1SEL0 |= BIT6 | BIT7; //将2个 UART 引脚设置为第二个功能

//配置 UART
UCA0CTLW0 |= UCSWRST; //软设置复位使能
UCA0CTLW0 |= UCSSEL_SMCLK; //将 SMCLK 设置为 BRCLK 以用于9600的波特率

//波特率计算。 将波特率设置为9600
UCA0BR0=6; //1000000/16/9600
UCA0MCTLW = 0x2000 | UCOS16 | UCBRF_8;

UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI

}

//ADC 中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)
#Elif defined (__GNU__)
_ define (interrupt (interrupt (ADC_vector

)#else)#error!
#endif
{
switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))
{
案例 ADCIV_NONE:
中断;
ADCIV_ADCOVIFG 案例:
中断;
案例 ADCIV_ADCTOVIFG:
中断;
ADCIV_ADCHIIFG 案例:
中断;
ADCIV_ADCLOIFG 案例:
中断;
ADCIV_ADCINIFG 案例:
中断;
ADCIV_ADCIFG 案例:
ADC_Result[通道打开]= ADCMEM0;
if (通道打开=0)
{
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //存在 LPM0
}
其他
{
通道 Open--;
}
中断;
默认值:
中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是您的所有代码、而是您获得的是空格"("\32")、"\0"或您的终端程序不知道如何处理的其他字符。 显然、您不应获得第94行和第96行之间的任何其他串行数据。 您是否看过示波器上的实际数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定,我不确定它是否内置在 RealTerm 中,但通过 UART 发送的每个8位值之间都有一个物理空间。 是的、在一个示波器上的实际数据是正确的、每个值之间只有一个随机空间。 这是我正在运行的代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但并非所有这些。
    未定义 NUMBER_SENSORS 和 ADCSensorID[]。

    您需要编写自己的 PC 程序并检查每个字符。 它似乎是 RealTerm 问题。 RealTerm 是否具有二进制模式? 当您的数据为'\32'时会发生什么情况? 或更差的“\n”?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、它的二进制模式和每8位用空格分隔。