请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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--;
}
中断;
默认值:
中断;
}
}