Processor

【라즈베리파이】 wiringPi C 언어 : UART로 구조체 송신과 수신

작성자 임베디드코리아 작성일26-02-19 23:48 조회630회 댓글0건
---< 예제 : UART_struct-send.c  송신하기 >------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <wiringSerial.h>
#include <unistd.h>
#include <stdint.h>

// 데이터 패킹을 위해 1바이트 정렬 사용 (송수신 구조체 일치)
#pragma pack(push, 1)
typedef struct {
    uint8_t header;    // 1바이트 패킷 시작 표시
    int16_t sensor1;  // 2바이트 데이터
    float sensor2;    // 4바이트 데이터
    uint8_t checksum;  // 1바이트 검증용
} PacketData;
#pragma pack(pop)

int main() {
    int fd;
    if ((fd = serialOpen("/dev/serial0", 9600)) < 0) { // 9600 보드레이트
        fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
        return 1;
    }

    PacketData data;
    data.header = 0xAA;
    data.sensor1 = 1234;
    data.sensor2 = 36.5f;
    data.checksum = data.header ^ (uint8_t)data.sensor1 ^ (uint8_t)data.sensor2;

    // 구조체 전체를 바이트 배열로 송신
    write(fd, &data, sizeof(PacketData));
    printf("Sent: %d bytes\n", (int)sizeof(PacketData));

    serialClose(fd);
    return 0;
}

---< 예제 : UART_struct-receive.c  수신하기 >-------------------------------------
#include <stdio.h>
#include <string.h>
#include <wiringSerial.h>
#include <unistd.h>
#include <stdint.h>

// 데이터 패킹을 위해 1바이트 정렬 사용 (송수신 구조체 일치)
#pragma pack(push, 1)
typedef struct {
    uint8_t header;    // 1바이트 패킷 시작 표시
    int16_t sensor1;  // 2바이트 데이터
    float sensor2;    // 4바이트 데이터
    uint8_t checksum;  // 1바이트 검증용
} PacketData;
#pragma pack(pop)

int main() {
    int fd;
    if ((fd = serialOpen("/dev/serial0", 9600)) < 0) {
        return 1;
    }

    PacketData receivedData;
   
    while(1) {
        // 시리얼 데이터가 들어왔는지 확인
        if (serialDataAvail(fd) >= sizeof(PacketData)) {
            // 구조체 크기만큼 읽어서 구조체 변수에 저장
            read(fd, &receivedData, sizeof(PacketData));
           
            if (receivedData.header == 0xAA) {
                printf("Received: S1=%d, S2=%.1f\n",
                      receivedData.sensor1, receivedData.sensor2);
            }
        }
        usleep(10000); // 10ms 대기
    }
   
    serialClose(fd);
    return 0;
}