Member 10515225 Ответов: 1

Чтение шестнадцатеричного значения с помощью mplab X


#include "mcc_generated_files/mcc.h"
#define EUSART_TX_BUFFER_SIZE 8
#define EUSART_RX_BUFFER_SIZE 8

/**
  Section: Global Variables
*/

volatile uint8_t eusartTxHead = 0;
volatile uint8_t eusartTxTail = 0;
volatile uint8_t eusartTxBuffer[EUSART_TX_BUFFER_SIZE];
volatile uint8_t eusartTxBufferRemaining;

volatile uint8_t eusartRxHead = 0;
volatile uint8_t eusartRxTail = 0;
volatile uint8_t eusartRxBuffer[EUSART_RX_BUFFER_SIZE];
volatile uint8_t eusartRxCount;


#define LED_RX RC7 // Pin assigned RX LED
#define LED_TX RC6 // Pin assigned TX LED
#define LED RC2 // Pin assigned for LED 
#define DE RC5


unsigned int count=0;
char data=0;
static int DEVICE_ID=1;
char rxbuf[50]=" ";
unsigned char Function_code=0X03;
static int index=0;
static int rec_flag = 0;
static int check_flag = 1;

unsigned char buff[10];

char data1[10];
unsigned char buf[20]; //array to hold twenty bytes


void EUSART_Initialize(void)
{
    // disable interrupts before changing states
    PIE3bits.RCIE = 0;
    PIE3bits.TXIE = 0;

    // Set the EUSART module to the options selected in the user interface.

    // ABDOVF no_overflow; SCKP Non-Inverted; BRG16 16bit_generator; WUE disabled; ABDEN disabled; 
    BAUD1CON = 0x08;

    // SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN enabled; 
    RC1STA = 0xB0;

    // TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC master; 
    TX1STA = 0xA4;

    TRISCbits.TRISC7 = 1; //As Prescribed in Datasheet
    TRISCbits.TRISC6 = 1; 
    RC1STAbits.CREN=1;
    TX1STAbits.TXEN=1;

    // Baud Rate = 9600; SP1BRGL 207; 
    SP1BRGL = 0xCF;

    // Baud Rate = 9600; SP1BRGH 0; 
    SP1BRGH = 0x00;

    // initializing the driver state
    eusartTxHead = 0;
    eusartTxTail = 0;
    eusartTxBufferRemaining = sizeof(eusartTxBuffer);

    eusartRxHead = 0;
    eusartRxTail = 0;
    eusartRxCount = 0;

    // enable receive interrupt
    PIE3bits.RCIE = 1;
}


uint8_t EUSART_Read(void)
{
    uint8_t readValue = 0;

    while(0 == eusartRxCount)
    {
    }

    readValue = eusartRxBuffer[eusartRxTail++];
    if(sizeof(eusartRxBuffer) <= eusartRxTail)
    {
        eusartRxTail = 0;
    }
    PIE3bits.RCIE = 0;
    eusartRxCount--;
    PIE3bits.RCIE = 1;
    eusartRxBuffer[8];

    return readValue;
}

void EUSART_Write(uint8_t txData)
{
    while(0 == eusartTxBufferRemaining)
    {
    }

    if(0 == PIE3bits.TXIE)
    {
        TX1REG = txData;
    }
    else
    {
        PIE3bits.TXIE = 0;
        eusartTxBuffer[eusartTxHead++] = txData;
        if(sizeof(eusartTxBuffer) <= eusartTxHead)
        {
            eusartTxHead = 0;
        }
        eusartTxBufferRemaining--;
    }
    PIE3bits.TXIE = 1;
}

char getch(void)
{
    return EUSART_Read();
}

void putch(char txData)
{
    EUSART_Write(txData);
}

void EUSART_Transmit_ISR(void)
{
    // add your EUSART interrupt custom code
    if(sizeof(eusartTxBuffer) > eusartTxBufferRemaining)
    {
        TX1REG = eusartTxBuffer[eusartTxTail++];
        if(sizeof(eusartTxBuffer) <= eusartTxTail)
        {
            eusartTxTail = 0;
        }
        eusartTxBufferRemaining++;
    }
    else
    {
        PIE3bits.TXIE = 0;
    }
}

void EUSART_Receive_ISR(void)
{
    if(1 == RC1STAbits.OERR)
    {
        // EUSART error - restart

        RC1STAbits.CREN = 0;
        RC1STAbits.CREN = 1;
    }

    // buffer overruns are ignored
    eusartRxBuffer[eusartRxHead++] = RC1REG;
    if(sizeof(eusartRxBuffer) <= eusartRxHead)
    {
        eusartRxHead = 0;
    }
    eusartRxCount++;
}


/* Send Data Serially */
 void send_string(const char *x)
 {
     while(*x)
     {
        EUSART_Write(*x++); 
     }
 }


/* Timer Interrupt Service Routine Program*/
void Blink_Count()
{
   if(PIR0bits.TMR0IF == 1)
   { 
       PIR0bits.TMR0IF =0;
       count=count+1;
       if(count>=15)
       {
          // LED=!LED;
           count=0;
       }
   }
}

void main(void)
{
    while (1)
    {
   data= EUSART_Read();
     rxbuf[10]=data;
     printf("%s\n",&rxbuf[10]);
     __delay_ms(150);
    }
} 


void main(void)
{
  EUSART_Initialize();
    while (1)
    {
     char array[20] = "Hello World";
     printf("%s\n",array);
      __delay_ms(150);
    }
}


Что я уже пробовал:

Я использую Mplab x Ide с v3.61 на компиляторе Xc8, PIC18F24K40. Я использовал сгенерированный MCC UART-код для отправки и получения данных. Для понимания я публикую свой код и публикую его часть.

Мой основной код выглядит так.


проблема, с которой я столкнулся, такова. Когда я пытаюсь отправить данные 0103000000Ac5CD в формате ASCii ,я получаю их как charcter, но когда я пытаюсь отправить их в шестнадцатеричном формате, я ничего не могу получить. Если я печатаю данные, как я использовал в рабочем примере hello print, я получил мусорное значение.

Richard MacCutchan

Понимаете ли вы разницу между ASCII и ASCII представлением шестнадцатеричного числа?

1 Ответов

Рейтинг:
2

KarstenK

Вы должны лучше понимать процесс отправки. Вы отправляете одиночные байты (обращаясь к массиву символов, поэтому строка-это массив символов, и она работает из коробки. Но для отправки int вы должны скопировать целое число в байтовый массив с конечным нулем.

char buffer[5] = {0};//memzero
memcpy( buffer, &intValue, 0);

и пошлите этот буфер. На стороне приемника вы должны обратно скопировать буфер в целое число.