Atmel 工作室无法将 char 数组作为字符串发送

Posted

技术标签:

【中文标题】Atmel 工作室无法将 char 数组作为字符串发送【英文标题】:Atmel studio cant send char array as String 【发布时间】:2018-07-23 12:13:56 【问题描述】:

这是一个我超过 3 个月都无法解决的问题。我尝试了各种方法,但不明白为什么我的代码不能正常工作。 我正在尝试通过UART 发送值。当我发送这样的值时

(Atmel Studio 7.0 , Atmega2560)

USART_Transmit('O'); 
USART_Transmit('k'); 
USART_Transmit('!'); 
USART_Transmit(0x0d); 
USART_Transmit(0x0a);//new line 

没有问题。输出如我所料

uart_atmel

但是,当我尝试发送名为 text 的 char 数组的第一个元素时,它显示的只是垃圾值。

这是我的完整代码

#define F_CPU 16000000L 
#include <avr/io.h> 

char Text[6] = "Hello"; // this is 

void USART_Init( unsigned int speed) 
 
    UBRR0H = (unsigned char)(speed>>8); //  baudrate setting 
    UBRR0L = (unsigned char)speed;   
    UCSR0B=(1<<RXEN0)|( 1<<TXEN0);  // rx and tx pins activated 
    UCSR0C = (0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);  character size 8
 

void USART_Transmit( unsigned char data ) 
 
    // ucsr0a  has a bit called UDRE0, is uart data register empty  , if yes wait
    while ( !( UCSR0A & (1<<UDRE0))) ;  

    UDR0 = data; 
 

int main(void)  

    USART_Init(103); // 103 is UBRR ,  (16000000/9600)*16  =104   104-1=103

    USART_Transmit('O'); 
    USART_Transmit('k'); 
    USART_Transmit('!'); 
    USART_Transmit(0x0d); 
    USART_Transmit(0x0a);//new line 
    //SendString(Text); 

    USART_Transmit(Text[0]);  //GARBAGE VALUE,  PRINTS 0xFF  should be ascii H ... 

   while (1)  

    
 

【问题讨论】:

一方面,你为什么不遵循一种类型?您在某些地方使用了unsigned char,在某些地方使用了char。从charunsigned char 的转换可能没有正确定义,因此总是通过0xff 字符串常量存储在闪存中而不是内存中。您不必以不同的方式访问它们或先将它们复制到 ram 吗? @GoswinvonBrederlow 没有。当您将其声明为数组(如此处)而不是指针时,它会自动复制。它应该在 main 函数调用之前由启动例程完成。 @AjayBrahmakshatriya 我将所有变量都更改为 char 但它不起作用。还更改了所有这些 un​​signed char 但没有运气 @ryyker 你能详细说明一下吗?这是编程微控制器的理想之选。 【参考方案1】:

我的代码正在使用 proteus 模拟程序。我已经尝试过 atmega2560/328/32 一切正常。 当我定义 const 或静态变量(字符串数组)时,它在船上工作。但是当 const 或静态数组长度大于 16 时,它不起作用。在模拟上一切正常,但在 Arduino Mega(atmega2560) 上不起作用。 (对不起英语)。

【讨论】:

以上是关于Atmel 工作室无法将 char 数组作为字符串发送的主要内容,如果未能解决你的问题,请参考以下文章

如何将二维数组类型 char(字符串)作为函数参数传递?

使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组

使用 2D 字符数组时将数组作为指针

使用 char 数组块作为内存输出操作数的内联汇编

Atmel studio 不工作用于发布或调试模式选择的工具窗口

char** argv作为字符串数组传递