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;
}
158-840 서울시 양천구 남부순환로 571(신월동, 영남타운 307호) l 대표: 박길성 ㅣ Tel:02-2695-1114 ㅣ Fax:02-2695-1113
Copyright © 2015 Embedded Korea. All Rights Reserved.