ASCII 到 int 到 ASCII (ATMEGA 2560)
ASCII to int to ASCII (ATMEGA 2560)
我正在尝试制作一个嵌入式 c 项目,我将在其中输入 7 个字符并用它们进行一些计算 - 现在我在转换工作时遇到问题 - 我正在使用 ATMEGA 2560,我在其中输出uart 上的字符。
代码如下:
volatile char daata[8] = "123:456[=10=]";
volatile char recdata[8];
volatile char data = 0;
volatile char byte;
volatile int minimum;
volatile int maximum;
volatile char mx;
volatile char mi;
我的函数使用:
void putsUSART0(char *ptr)
{
while(*ptr)
{
putchUSART0(*ptr);
ptr++;
}
}
和
void putchUSART0(char tx)
{
while(!(UCSR0A & (1 << UDRE0))); // wait for empty transmit buffer
UDR0 = tx;
}
我正在处理的代码是:
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 is:maximum is:ˆ
任何人都可以解释这种奇怪的行为。
char buf[15];
...
mi = minimum + 0x30;
sprintf(buf, "%d", mi);
putsUSART0("mimimum is:");
//putchUSART0(minimum );
putsUSART0(buf);
最大也做类似的事情
您正在发送 ASCII 字符的值(并尝试通过添加 0x30
将其转换为字符,这不是正确的方法,您需要转换所有数字)并可能在不转换的情况下打印它另一端。
来自Lundin
的亲切评论
sprintf() is probably not an option, as this is an embedded project,
where that function usually is far too slow and memory-consuming.
您也可以编写自己的函数将数字转换为字符串:
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
的亲切评论
Fails for numToStr(INT_MIN) Suggest if(n < 0) { neg = 1; } else { n =
-n; } do { buf[--pos] = '0' - (n % 10); n /= 10; } while(n);
处理INT_MIN
的版本可以写成:
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];
}
daata[4]
应该是 daata[4] - 0x30
。这会导致您得到 100*52 而不是预期的 100*4。
避免像这样的简单错误的方法是一些编码规则:不要将所有内容放在同一行,保持一致并避免 "magic numbers"。
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'));
我正在尝试制作一个嵌入式 c 项目,我将在其中输入 7 个字符并用它们进行一些计算 - 现在我在转换工作时遇到问题 - 我正在使用 ATMEGA 2560,我在其中输出uart 上的字符。
代码如下:
volatile char daata[8] = "123:456[=10=]";
volatile char recdata[8];
volatile char data = 0;
volatile char byte;
volatile int minimum;
volatile int maximum;
volatile char mx;
volatile char mi;
我的函数使用:
void putsUSART0(char *ptr)
{
while(*ptr)
{
putchUSART0(*ptr);
ptr++;
}
}
和
void putchUSART0(char tx)
{
while(!(UCSR0A & (1 << UDRE0))); // wait for empty transmit buffer
UDR0 = tx;
}
我正在处理的代码是:
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 is:maximum is:ˆ
任何人都可以解释这种奇怪的行为。
char buf[15];
...
mi = minimum + 0x30;
sprintf(buf, "%d", mi);
putsUSART0("mimimum is:");
//putchUSART0(minimum );
putsUSART0(buf);
最大也做类似的事情
您正在发送 ASCII 字符的值(并尝试通过添加 0x30
将其转换为字符,这不是正确的方法,您需要转换所有数字)并可能在不转换的情况下打印它另一端。
来自Lundin
的亲切评论sprintf() is probably not an option, as this is an embedded project, where that function usually is far too slow and memory-consuming.
您也可以编写自己的函数将数字转换为字符串:
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
的亲切评论Fails for numToStr(INT_MIN) Suggest
if(n < 0) { neg = 1; } else { n = -n; } do { buf[--pos] = '0' - (n % 10); n /= 10; } while(n);
处理INT_MIN
的版本可以写成:
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];
}
daata[4]
应该是 daata[4] - 0x30
。这会导致您得到 100*52 而不是预期的 100*4。
避免像这样的简单错误的方法是一些编码规则:不要将所有内容放在同一行,保持一致并避免 "magic numbers"。
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'));