Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
UART嵌入式应用程序上的ASCII字符串到十六进制值转换_C_Pic_Uart_Led_Mplab - Fatal编程技术网

UART嵌入式应用程序上的ASCII字符串到十六进制值转换

UART嵌入式应用程序上的ASCII字符串到十六进制值转换,c,pic,uart,led,mplab,C,Pic,Uart,Led,Mplab,我正在做一个嵌入式项目[PIC MCU],我将通过UART接收数据。数据将包含一些ascii值,我必须将其转换为十六进制,这些转换后的十六进制值将进一步用于某些操作。我需要帮助 所以我的问题是,任何人都有逻辑的部分,如何做到这一点?不过我已经做了一些工作。任何stackoverflow线程、提示或代码都将受到高度重视 这是我到现在为止的密码 #include "mcc_generated_files/mcc.h" #define _XTAL_FREQ 16000000 #define FRAME

我正在做一个嵌入式项目[PIC MCU],我将通过UART接收数据。数据将包含一些ascii值,我必须将其转换为十六进制,这些转换后的十六进制值将进一步用于某些操作。我需要帮助 所以我的问题是,任何人都有逻辑的部分,如何做到这一点?不过我已经做了一些工作。任何stackoverflow线程、提示或代码都将受到高度重视 这是我到现在为止的密码

#include "mcc_generated_files/mcc.h"
#define _XTAL_FREQ 16000000
#define FRAMESIZE 18

void main(void)
{
   uint8_t data ,i,j;
   uint8_t value;
   uint8_t RX_Buffer [] ,RGB_data[] ,HEX_data[]   ;

    // initialize the device
    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();          // Enable the Global Interrupts
    INTERRUPT_PeripheralInterruptEnable();      // Enable the Peripheral Interrupts


    do
    {
        data = EUSART_Read();             // Read received character
        for (i = 0; i<FRAMESIZE ; i++)
        {
          RX_Buffer[i] = data;
        }

        EUSART_Write(data);               // Echo back the data received
        }while(!RCIF);        //check if any data is received

        // my UART data command starts with R and ends with '\n'
        if(RX_Buffer[0]=='R' && RX_Buffer[FRAMESIZE-1] == '\n')
        {
             LATAbits.LATA2   = 1;          //check flag
            __delay_ms(2000);
             LATAbits.LATA2   = 0;

            for (j = 0 ; j = 5; j++ )               // get the RGB value in separate array
            {
                RGB_data[j] = RX_Buffer[j+3];
                HEX_data[value] = RGB_data[j]/16 ;
              // so I am somewhat stuck how can I collect the UART data {for eg "RGBFF00A0AA" is my command which will be in ascii
               if (HEX_data[value] <=9)
                {
                   HEX_data[value] += '0';                    
                }
                else 
                {
                    HEX_data[value]=HEX_data[value]-10+'A';
                }

            }

        }
#包括“mcc_生成的文件/mcc.h”
#定义频率16000000
#定义帧大小18
真空总管(真空)
{
uint8_t数据,i,j;
uint8_t值;
uint8_t接收_缓冲区[],RGB_数据[],十六进制数据[];
//初始化设备
系统初始化();
中断_globalinterrupEnable();//启用全局中断
中断_peripheraldinterruptenable();//启用外围中断
做
{
data=EUSART_Read();//读取接收到的字符

对于(i=0;i如果您有stdio,那么将ASCII输入转换为十六进制非常简单。

void AsciiToHex(char * src, char * dest)
{
  while(*src)
  {
    sprintf(dest + strlen(dest), " %02X", *src);
    src++;
  }
} 
编辑:

在小型微控制器(attiny、PIC 16F、8051和其他)中,您将无法使用stdio…在这种情况下,您将需要一种更实用的方法,类似于以下代码:

void AsciiToHex(char * src, char * dest)
{
  char hex[] = "0123456789ABCDEF";
  while(*src)
    {
      char low, high;
      high = *src >> 4; // high nibble
      low = *src & 0x0f; // low nibble
      *dest = hex[high];
      dest++;
      *dest = hex[low];
      dest++;
      *dest = ' ';
      dest++;
      src++;
    }
  *dest = 0;
}

首先,你应该将转换委托给一个函数,你需要编写,而不是在
main
函数中进行。其次,你应该正确格式化你的源代码。现在,它看起来一团糟。你的标题是“ASCII到十六进制”,但您的代码将二进制值转换为ASCII。你们明白其中的区别吗?我想使用Micrchip,MPLAB stdio lib不起作用,因为它纯粹是为嵌入式项目编译的…我试图找到它,但我认为它不会起作用。如果是,我将它发布在这里,作为那些将为itMicrochip找到它的人的答案。microchip确实使用stdio,但仅用于h高端微控制器…据我所知是18F或更好。你需要更多的实践方法…我将很快在这个答案上发布…你的AsciiToHex()例程与其名称不符。即使它的名称正确,它也不能正确转换(即二进制“字符串”不是以NULL结尾)。此外,二进制值需要类型unsigned。这很容易修复…只需添加一个参数来指定二进制字符串的大小,并在循环的每次迭代中减小它,然后测试它而不是src…此外,unsigned在这种情况下不起任何作用。我没有使用任何利用信号的计算…@LuizMenezes好的,我等待您对此的答复…the更具体地说,我的问题与这个问题更相关..该线程来自microchip论坛->