接收字符并输出其ASCII十六进制值
我正在为ATMEGA微控制器上的UART编程(用C)我自己的串行函数,我需要让用户输入一个字符,并让它输出ASCII十六进制值 i、 e.如果用户键入“a”,则输出为“0x61”。我编写了一个函数,名为接收字符并输出其ASCII十六进制值,c,arduino,microcontroller,avr,atmega,C,Arduino,Microcontroller,Avr,Atmega,我正在为ATMEGA微控制器上的UART编程(用C)我自己的串行函数,我需要让用户输入一个字符,并让它输出ASCII十六进制值 i、 e.如果用户键入“a”,则输出为“0x61”。我编写了一个函数,名为 putvalue(无符号字符ch) 它接收一个字符并将其显示在屏幕上,所以现在我只需要编写一个函数,它接收字符并将其转换为对应于ASCII十六进制值的字符。到目前为止,我已经完成了以下工作: void puthexvalue(unsigned char ch) { putvalue(0x
putvalue(无符号字符ch)
它接收一个字符并将其显示在屏幕上,所以现在我只需要编写一个函数,它接收字符并将其转换为对应于ASCII十六进制值的字符。到目前为止,我已经完成了以下工作:
void puthexvalue(unsigned char ch) {
putvalue(0x30) \\writes a '0' to the screen
putvalue(0x78) \\writes an 'x' to the screen
unsigned char ch1 = ch & 0xF0;
unsigned char ch2 = (ch & 0x0F) >> 4;
所以现在我有了我想在
ch1
和ch2
中打印的字符的数值,但我不确定如何找到对应于这些数字的ASCII值并打印该值
任何提示或帮助都将不胜感激,谢谢
编辑:它应该是
ch1=ch&0xf0>>4
和ch2=ch&0x0f
从'0'
到'9'
的字符代码保证在C规范中是连续的
从
'A'
到'Z'
和从'A'
到'Z'
的字符代码在ASCII码中是连续的
因此,如果数字介于0和9之间,可以通过向数字添加'0'
来获得ASCII码。
如果数字介于10和15之间,您可以通过将'A'
或'A'
添加到减去10的数字来获得ASCII码
另外,您对ch1
和ch2
的计算是错误的:ch1
是16的乘法(因为低位被清除),而ch2
将始终为零(因为最后4位以外的位被清除,然后右移4位)
包括固定计算ch1
和ch2
的实现如下:
char getHexChar(unsigned char c) {
if (c <= 9) return '0' + c;
else if (c <= 15) return 'A' + (c - 10);
else return '?';
}
void puthexvalue(unsigned char ch) {
putvalue(0x30); //writes a '0' to the screen
putvalue(0x78); //writes an 'x' to the screen
unsigned char ch1 = (ch & 0xF0) >> 4;
unsigned char ch2 = ch & 0x0F;
putvalue(getHexChar(ch1));
putvalue(getHexChar(ch2));
}
char getHexChar(无符号字符c){
if(c4;
无符号字符ch2=ch&0x0F;
putvalue(getHexChar(ch1));
putvalue(getHexChar(ch2));
}
“现在我有了要在ch1
和ch2
中打印的字符的数值。”不,你没有。至少ch2
是零,并且它不是你想要打印的数值。@MikeCAT啊,你是对的。在原始代码中,我用另一种方式得到了它,只是不小心在代码中为0F而不是od F0编写了它。谢谢,这非常有用!仅供参考,我确实有原始的F0值四位,我在写这个问题时不小心切换了它,没有注意到。我可以问一下为什么默认返回为返回“?”?是因为“?”符号在ASCII中是特殊的还是只是返回一个?当输入了不受支持的符号时?它只是返回?
。您可以使用您最喜欢的字符作为fallback.cool。但我只是想确认它不应该真的需要回退到那个位置。bc理想情况下,我希望我的程序能够处理所有可能输入的字符。嗯,回退是不需要的,因为ch1
和ch2
由于掩码的作用,将仅介于0和15之间。char getHexChar(unsigned char c){返回c