Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接收字符并输出其ASCII十六进制值_C_Arduino_Microcontroller_Avr_Atmega - Fatal编程技术网

接收字符并输出其ASCII十六进制值

接收字符并输出其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

我正在为ATMEGA微控制器上的UART编程(用C)我自己的串行函数,我需要让用户输入一个字符,并让它输出ASCII十六进制值

i、 e.如果用户键入“a”,则输出为“0x61”。我编写了一个函数,名为

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