UART蓝牙通信问题 向UART发送数据的正确格式是啥(整数值)

     2023-02-22     286

关键词:

【中文标题】UART蓝牙通信问题 向UART发送数据的正确格式是啥(整数值)【英文标题】:UART bluetooth communication problem What is the proper format to send data to the UART (integer values)UART蓝牙通信问题 向UART发送数据的正确格式是什么(整数值) 【发布时间】:2019-07-15 16:56:41 【问题描述】:

我已经创建了从 UART 发送和接收的函数,并且发送数据似乎不是问题。在数据可视化器中,我们可以看到这些值,甚至可以绘制它们。 然而,当通过蓝牙发送这些数据时,我们无法在许多可用的应用程序中获取绘制它们的值。 我认为我们通过 UART 和蓝牙发送数据的方式存在问题,这就是为什么我们无法获得要绘制的值。

作为一个初学者,如果下面的代码没问题,如果有错误以及是否有更好的方法通过UART发送数据以便蓝牙好好工作。目标是能够在手机上绘制(图形)值。

非常感谢

#define F_CPU 16000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdio.h>

    #define BAUDRATE 9600
    #define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1)

//----------VARIABLES

    float V_n,V_nm1,V_measure=0;
    volatile int Velo_pulse;
    float Exp_fltr_Coeff=0.2;
    unsigned int Counter_ADC=0b0001;

    unsigned int Value1;

    char String[]="";

//----------Functions Definition
//---timers


    void Timer1_Control();
        void AttachInterrupt();

    //---AnalogueRead


    void Set_Ports();
        void AnalogRead_Setup();
        unsigned int AnalogRead();

    //---UART


    void USART_init(void);
        unsigned char USART_receive(void);
        void USART_send( unsigned char data);
        void USART_putstring(char* StringPtr, unsigned int Value1);


    int main(void)
        USART_init();                   //Call the USART initialization code

        Set_Ports();
        AnalogRead_Setup();
        AttachInterrupt();
        Timer1_Control();
        sei();

        while(1)


        _delay_ms(1);
        

        return 0;
    

    void USART_init(void)

        UBRR0H = (unsigned char)(BAUD_PRESCALLER>>8);           //UBRR0H = (uint8_t)(BAUD_PRESCALLER>>8);
        UBRR0L = (unsigned char)(BAUD_PRESCALLER);
        UCSR0B = (1<<RXEN0)|(1<<TXEN0);                 //Enable receiver / transmitter
        UCSR0C =  (1<<USBS0)|(3<<UCSZ00);               //Set frame format: 8data, 2stop bit
    

    unsigned char USART_receive(void)

        while(!(UCSR0A & (1<<RXC0)));                   //Wait for data to be received (buffer RXCn in the UCSRnA register)
        return UDR0;

    

    void USART_send( unsigned char data)

        while(!(UCSR0A & (1<<UDRE0)));                  //Waiting for empty transmit buffer (buffer UDREn in the UCSRnA register)
        UDR0 = data;                                    //Loading Data on the transmit buffer

    

    void USART_putstring(char* String, unsigned int Value1)


        sprintf(String,"%d\r\n",Value1);

        while(*String != 0x00)
            USART_send(*String);
        String++;

    

    void Set_Ports()
    
        DDRD = 0b11111111;  //All port is output
        DDRD ^= (1 << DDD5);     // PD5 is now input
    


    ISR(ADC_vect)
    
        //ADMUX ^= Counter_ADC; //Swapping between ADC0 an ADC1
    

    void AnalogRead_Setup()
    
        ADCSRA |= (1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0);               // Set ADC prescaler to 16 - 1 MHz sample rate @ 16MHz

        ADMUX |= (1 << REFS0);                                              // Set ADC reference to AVCC
        ADMUX |= (1 << ADLAR);                                              // Left adjust ADC result to allow easy 8 bit reading



        ADCSRA |= (1 << ADATE);                                             // Set ADC to Free-Running Mode
        ADCSRA |= (1 << ADIE);                                              // Interrupt in Conversion Complete
        ADCSRA |= (1 << ADEN);                                              // Enable ADC

    

    unsigned int AnalogRead(unsigned int PortVal)
    
        if (PortVal==5)
            ADMUX |= (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (1 << MUX0);     //sets the pin 0101 sets pin5
         else if (PortVal==4)
            ADMUX |= (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0);     //sets the pin 0101 sets pin4
        

        ADCSRA |= (1 << ADSC);                                              // Start A2D Conversions
        //while(ADCSRA & (1 << ADSC));
        return ADCH;
    


    //----------Timer Functions
    ISR (TIMER1_COMPA_vect)    // Timer1 ISR (compare A vector - Compare Interrupt Mode)
    
        cli();
        V_measure=(Velo_pulse*60/0.250);
        //USART_putstring(String,Velo_pulse);
        Velo_pulse=0;
        V_n=Exp_fltr_Coeff*V_measure+(1-Exp_fltr_Coeff)*V_nm1;
        V_nm1=V_n;
        USART_putstring(String,(int)V_n);
        sei();
    

    ISR (INT0_vect)
    
        Velo_pulse++;
        //USART_putstring(String,Velo_pulse);
    

    void Timer1_Control()
    
        TCCR1A=0b00000000;          //Clear the timer1 registers
        TCCR1B=0b00000000;
        TCNT1=0b00000000;

        TCCR1B=0b00001101;          //Sets prescaler (1024) & Compare mode
        OCR1A=2604;                 // 160ms - 6 Hz

        TIMSK1=0b00000010;
    

    void AttachInterrupt()
    
        DDRD ^= (1 << DDD2);        // PD2 (PCINT0 pin) is now an input
        PORTD |= (1 << PORTD2);     // turn On the Pull-up // PD2 is now an input with pull-up enabled

        EICRA = 0b00000011;         // set INT0 to trigger on rising edge change
        EIMSK = 0b00000001;         // Turns on INT0
    

【问题讨论】:

了解您使用的设备或开发板真的很有帮助... 【参考方案1】:

看字符串初始化:

char String[]="";

这会分配一个大小为 1 的字符数组(以 0 结尾)。

然后进行调用,将此数组引用作为第一个参数传递:

USART_putstring(String,(int)V_n);

USART_putstring如下:

void USART_putstring(char* String, unsigned int Value1)
    sprintf(String,"%d\r\n",Value1);
    while(*String != 0x00)
        USART_send(*String);
    String++;

注意sprintf(String,"%d\r\n",Value1); 它将数值转换为字符缓冲区。 IE。缓冲区应该足够大以包含数字的文本表示、换行符\r\n\ 和零 - 字符串终止符。

但是由于您的字符串缓冲区的大小仅为 1 个字符,这完全取决于运气,sprintf 之后会发生什么:也许有一些未使用的内存区域,所以整个事情看起来好像它工作正常。也许还有一些其他的变量,它们的值会被覆盖,这使得程序的行为在未来变得意想不到。或者可能有一些重要数据,您的应用程序将崩溃。添加几行并重新编译代码后,行为可能会发生变化。

重点是:小心使用缓冲区。不要使用常量进行初始化,而是设置缓冲区的确切大小。数字长度最多为 6 个符号(1 个可能的符号和 5 个数字,假设您使用的是 AVR-GCC,它的 int 16 位宽,因此最小为 -32768)+ 2 表示 \r\n\ + 1 用于终止零。 IE。缓冲区的大小应为 9至少

char String[9];

【讨论】:

开发板通过uart向主机发送数据

1/*********************************2代码功能:开发板通过UART向主机发送数据3使用函数:4Serial.begin(数据传输的波特率);5Serial.println(传回的数据);6创作时间:2016*10*077作者邮箱:[email protected]8********************************/9voidsetup() 查看详情

uart是啥东西?

...步收发传输器,通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。具体实物表现为独立的模块化芯片,或作为集成于... 查看详情

uart波形分析

  经常遇到初学者,对单片机串行通讯出了问题不知道如何办的情况。其实最有效的调试方法是用示波器观察收发数据的波形。通过观察波形可以确定以下情况:1、数据是否接收或发送;2、数据是否正确;3、波特率是否正确... 查看详情

uart

...8位)、校验位(可选)、停止位(可选位数1位或2位)。通信双方的可选部分的设置必须完全一致。数据成功的发送和接收,都有专门的中断和状态位来指出。对于UART,TXBUF和RXBUF都是能触发中断的,只要中断使能,也能触发发... 查看详情

解析时限 UART 数据

...:Parsingtime-delimitedUARTdata【发布时间】:2015-01-2500:05:30【问题描述】:在尝试对UART连接上的数据进行正确的逆向工程和解码时,我得出了以下关于所接收数据格式的结论。数据以“数据包”形式发送。每个数据包仅由传输之间的... 查看详情

怎样用汇编语言向uart发送寄存器中装载数据

发送数据,一般需要有内容与接收地址;例如,要将\'A\'发送出去,就需要将\'A\'传递给UART接收的对口地址。电脑配置给uart,一般的地址就是3f8、2f8.....,汇编语言如下:movdx,3f8h  ;;即将传递数据的地址moval,41h    ;;41h就是\'A\'out... 查看详情

uart与usart的区别

...通用同步和异步收发器UART:通用异步收发器当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能。这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。 同步是指:发送方发出数据后... 查看详情

arduino(esp32c3)uart通信问题serial.write发送到哪了?

...任何反应已知接线没问题程序正常运行猜测可能串口uart通信问题我不太懂不知道Serial.write发送到哪了跪求高人指点刚刚学arduino参考技术A用数据线连接电脑能收到信息,你在串口软件中看看打开的串口信息,是不是CH34x串口。程... 查看详情

stm32串口发送接收数据(代码片段)

目录串口通信串口的结构体如何配置串口的发送通过串口向电脑发送ok字符封装发送字符串函数串口通信我用的32是stm32f10x最小系统没有UART4和UART5USART:通用同步异步收发器UART:通用异步收发器nRTS:请求发送nCTS:请求接收区别:US... 查看详情

一文搞懂uart通信协议

...3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位4、UART通信步骤1、UART简介UART(UniversalAsynchronousReceiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就... 查看详情

一文搞懂uart通信协议

...3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位4、UART通信步骤1、UART简介UART(UniversalAsynchronousReceiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就... 查看详情

基于stm32之uart串口通信协议发送(代码片段)

...串口的发送功能。2、UART简介  嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter)。3、准 查看详情

计算机与 BASYS 3 FPGA 之间的 UART 通信

】计算机与BASYS3FPGA之间的UART通信【英文标题】:UARTcommunicationbetweencomputerandBASYS3FPGA【发布时间】:2017-08-0613:52:23【问题描述】:我有一个项目,我需要将数据从Windows10计算机发送到BASYS3板(ARTIX7FPGA)。我使用UART来做到这一点... 查看详情

C语言的UART通信(十六进制)

】C语言的UART通信(十六进制)【英文标题】:UARTCommunicationInClanguage(Hex)【发布时间】:2021-11-1710:34:45【问题描述】:我想向写入函数发送一个十六进制值。(例如,0×90)。这是因为需要通信的设备以十六进制数字接收命令。... 查看详情

UART模块和运算

...:我想使用Verilog在fpga(Nexys2)中分别点亮LED,但我没有在蓝牙(hc-06)和fpga之间同步。例如:我从手机发送255(11111111)并点亮LED4。它应该点亮了所有8个LED。我怀疑问题是我没有正确设置波特率(蓝牙波特率默认为9600)。我的Verilog代... 查看详情

stm8s单片机uart串口通信如何实现连续发送和接收两个8位数据

先说发送第一个字节是地址没问题,理论上是不是发送下一字节要根据回应的ACK来决定,但实际实现的时候是直接发送的而不理会其ACK,每发送一个8比特,你要间隔1个比特位供从机向总线上写ACK,然后你再写第二字节数据,同... 查看详情

我的 ESP32 代码在 Arduino uno 之间建立 UART 通信是不是正确?

】我的ESP32代码在Arduinouno之间建立UART通信是不是正确?【英文标题】:IsmyESP32codecorrecttoestablishUARTcommunicationbetweenArduinouno?我的ESP32代码在Arduinouno之间建立UART通信是否正确?【发布时间】:2021-08-0803:45:35【问题描述】:所以我正... 查看详情

如何避免在 UART 通信期间损坏控制器

】如何避免在UART通信期间损坏控制器【英文标题】:howtoavoiddamagingcontrollerduringUARTcommunication【发布时间】:2020-06-3013:30:18【问题描述】:我正在尝试与使用efm32lg230f256控制器的主板通信。我想购买一条用于RS232UART通信的电缆,其... 查看详情