首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASCII到ASCII (ATMEGA 2560)

ASCII到ASCII (ATMEGA 2560)
EN

Stack Overflow用户
提问于 2015-05-05 12:57:26
回答 2查看 567关注 0票数 2

我正在尝试做一个嵌入式c项目,我将输入7个字符并使用它们进行一些计算--现在我在转换到工作时遇到了问题--我正在使用ATMEGA 2560,在那里我在uart上输出字符。

下面是代码:

代码语言:javascript
复制
volatile char daata[8] = "123:456\0";
volatile char recdata[8];
volatile char data = 0;
volatile char byte;
volatile int minimum;
volatile int maximum;
volatile char mx;
volatile char mi;

我的功能是:

代码语言:javascript
复制
void putsUSART0(char *ptr)
{
    while(*ptr)
    {
        putchUSART0(*ptr);
        ptr++;
    }
}

代码语言:javascript
复制
void putchUSART0(char tx)
{
    while(!(UCSR0A & (1 << UDRE0)));   // wait for empty transmit buffer

    UDR0 = tx;
}

我正在处理的代码是:

代码语言:javascript
复制
minimum = (100 * (daata[0] - 0x30) + 10 * (daata[1] - 0x30) + daata[2] - 0x30);
maximum = daata[6] - 0x30 + 10 * (daata[5] - 0x30) + 100 * (daata[4]);

mi = minimum + 0x30;
putsUSART0("mimimum is:");
//putchUSART0(minimum );
putsUSART0(mi);
putsUSART0("maximum is:");
putchUSART0(maximum);
_delay_ms(5000);
status = requestsample;

问题是我的输出是

mimimum :maximum is:ˆ

有人能解释一下这种奇怪的行为吗。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-05 13:08:03

代码语言:javascript
复制
char buf[15];
...
mi = minimum + 0x30;
sprintf(buf, "%d", mi);
putsUSART0("mimimum is:");
//putchUSART0(minimum );
putsUSART0(buf);

最大限度地做类似的事

您正在发送ASCII字符的值(并试图通过添加0x30 (这不是正确的方法,需要转换所有数字)将其转换为字符),并可能在另一端不进行转换就打印它。

从对Lundin的善意评论

sprintf()可能不是一个选项,因为这是一个嵌入式项目,该函数通常速度太慢,内存消耗太大。

您还可以编写自己的函数,该函数可以将数字转换为字符串:

代码语言:javascript
复制
const char *numToStr(int n) {
  /* Non-reentrant, returned buffer will be invalidated on subsequent call */
#define BUF_SIZE 15
  static char buf[BUF_SIZE] = {0};
  int pos = BUF_SIZE - 1;
  int neg = 0;
  if(n < 0) {
    neg = 1;
    n *= -1;
  }
  do {
    buf[--pos] = (n % 10) + '0';
    n /= 10;
  } while(n);
  if(neg) buf[--pos] = '-';
  return &buf[pos];
}

并使用它将数字转换为字符串。

从对Chux的善意评论

numToStr失败(INT_MIN)建议if(n < 0) { neg = 1; } else { n = -n; } do { buf[--pos] = '0' - (n % 10); n /= 10; } while(n);

处理INT_MIN的版本可以编写为:

代码语言:javascript
复制
const char *numToStr(int n) {
  /* Non-reentrant, returned buffer will be invalidated on subsequent call */
#define BUF_SIZE 15
  static char buf[BUF_SIZE] = {0};
  int pos = BUF_SIZE - 1;
  int neg = 0;
  if(n < 0) {
    neg = 1;
  } else {
    n = -n;
  }
  do {
    buf[--pos] = '0' - (n % 10);
    n /= 10;
  } while(n);
  if(neg) buf[--pos] = '-';
  return &buf[pos];
}
票数 4
EN

Stack Overflow用户

发布于 2015-05-05 13:13:41

daata[4]应该是daata[4] - 0x30。这将导致您得到100*52而不是预期的100*4。

避免像这样简单的bug的方法是一些编码规则:不要把所有的东西都放在同一条线上,保持一致,避免“神奇的数字”。

代码语言:javascript
复制
minimum =   (100 * (data[0] - '0') 
          + ( 10 * (data[1] - '0') 
          + (  1 * (data[2] - '0');

maximum =   (100 * (data[4] - '0'))
          + ( 10 * (data[5] - '0'))
          + (  1 * (data[6] - '0'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30053671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档