Nếu bạn quyết định bỏ qua việc thêm phần cứng bổ sung và chỉ đi theo lộ trình bit-bang, điều này không khó như một số hình ảnh.
Trước hết, chủ đề giao tiếp của bạn phải đi theo thời gian thực:
#include<sched.h>
struct sched_param param;
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, ¶m ) == -1 )
{
perror("sched_setscheduler");
return -1;
}
Từ giờ trở đi, chuỗi của bạn sẽ không bị xóa trước 950ms trong mỗi giây * , trừ khi nó trả lại quyền kiểm soát một cách tự nguyện (thông qua sched_yield()
hoặc usleep()
) một cách kịp thời, điều đó sẽ không khiến nó bị xóa trước bao giờ. Với CPU 850 MHz, vòng lặp bit-bang của bạn sẽ chạy không tải hầu hết thời gian ngay cả ở tốc độ nhanh nhất.
Thật không may, yêu cầu trả lại quyền kiểm soát theo thời gian có nghĩa là trong khi chủ đề của bạn đang ngủ, bất cứ điều gì "bên đối lập" của bạn gửi, sẽ bị mất mãi mãi. Nhưng với mục đích đó, bạn có thể sử dụng điều khiển truyền dẫn. Hoặc phân bổ thêm một số GPIO cho dòng CTS mà bạn kéo xuống trước khi thu được và sao lưu khi khôi phục điều khiển:
bcm2835_gpio_write(CTS_PIN, LOW);
usleep(10);
bcm2835_gpio_write(CTS_PIN, HIGH);
hoặc (tốt nhất là IMHO) sử dụng điều khiển truyền XON / XOFF - gửi ký tự XOFF qua RS232 trước khi ngủ, XON sau khi bạn tiếp tục hoạt động. Các mã ASCII mặc định cho các mã này là '\x13'
dành cho XOFF / "dừng gửi" và '\x11'
cho XON / "gửi lại".
Tất nhiên thiết bị từ xa của bạn phải tuân theo những điều này. Nếu không, một số dữ liệu sẽ bị mất.