UART сравнить диаграммы. Бигльбоун

У меня возникла проблема при попытке сравнить входные данные uart (от GPS) с «$», чтобы обнаружить новый пакет. Я уверен, что проблема в том, как я манипулирую переменной charRead. Я перепробовал тысячу вещей, но, наверное, по неопытности так и не понял, в чем проблема. Код компилируется, и данные поступают все время, но как только я загружаю код в биглбон, он складывается, но не входит в «if (charRead == '$')».

Заранее спасибо!

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <time.h>
#include <iostream>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <limits.h>
#include "Payload.h"


#define SLOTS "/sys/devices/bone_capemgr.9/slots"
#define CR         0x0d
#define SPACE     0x20
#define COMMA     0x2C
#define MAXSIZE    100
unsigned long time_data;
unsigned int button = 45;
int i,z =0, j=0, value;
int rx_length;


int main()
{
    //uart4 configuration using termios

    int fd;
    //unsigned char  *mess;
    unsigned int value = 0;

    gpio_export(button);

    //Wait until the button is pushed
        while (value != 1){
            if (z==0){
            printf("waiting\n");}
                    z++;
            gpio_get_value(button, &value);}



    //OPEN THE UART
    //open uart4 for tx/rx, not controlling device

        if((fd = open("/dev/ttyO4", O_RDONLY | O_NOCTTY|O_NONBLOCK)) < 0){
            printf("Unable to open uart4 access.\n");
            }
        termios uart4;
        cfsetospeed(&uart4, B9600); //Set the speed

        //set attributes of uart4
        uart4.c_iflag = 0;
        uart4.c_oflag = 0;
        uart4.c_lflag = 0;
        tcsetattr(fd, TCSANOW, &uart4);




        //----- CHECK FOR ANY RX BYTES -----
            // Read up to 100 characters from the port if they are there

            unsigned char stringRead[MAXSIZE];
            unsigned char charRead;


        do{

            if (rx_length = read(fd, (void*)charRead, MAXSIZE)>0){

                if (charRead =='$'){
                i=0;
                stringRead[i] = charRead; //Store in the first position of the char --> $
                do {
                        rx_length = read(fd, (void*)charRead, MAXSIZE); //Read the next bit
                        if( (charRead != '\0') ) { 
                        i++;
                        stringRead[i] = charRead; //write into stringRead
                            }
                } while(charRead != 'CR'); //ASCII Carriage Return
                    stringRead[i+1] = charRead;
                    printf("%s", stringRead);
                }}
            if (rx_length==0){
                //No data
            }

        gpio_get_value(button, &value);

        }while (value!=0);

    gpio_unexport(button);

close(fd);
return 0;
}

person landondonovan    schedule 21.11.2014    source источник
comment
эта строка: if (rx_length = read(fd, (void*)charRead, MAXSIZE)›0){ нужен еще один набор скобок, а указатель на принимающую память нуждается в исправлении, и вы читаете только один символ, поэтому: if ( (rx_length = read(fd, &charRead, 1))›0){ поэтому сравнение выполняется со значением, помещенным в rx_length, и есть место для чтения символа в   -  person user3629249    schedule 21.11.2014


Ответы (2)


Вы передаете приведение значения переменной charRead, а не указатель на ячейку памяти, поскольку функция read() ожидает void *.

read(fd, (void*)charRead, MAXSIZE)

Вам нужно либо читать по одному символу за раз:

read(fd, &charRead, 1)

Или измените свою логику чтения, чтобы максимизировать объем чтения и обработки данных. Я также рекомендую добавить проверку границ при доступе к stringRead.

person Ioan    schedule 21.11.2014

person    schedule
comment
Большое спасибо!!! Я пробовал, но он показывает, что чтение не удалось: ресурс временно недоступен. попробую завтра еще. Еще раз большое спасибо! - person landondonovan; 21.11.2014
comment
// Примечание: возможно, лучше прочитать текущие значения термоуровня. Это было ключом. Чтение значений termios решило проблему. Спасибо - person landondonovan; 12.01.2015