trước hết, không biết lý do tại sao bạn đầu tiên đặt tất cả các lĩnh vực termios đến 0, và sau đó, mà không cần bất kỳ sửa đổi để 0 rằng trước đó, quyết định thành lập các cờ rs232 thông thường trên cflag. (thay vì làm điều đó mà không có OR trực tiếp, bây giờ bạn đặt nó là 0, ở trên).
những gì bạn có thể thích - cài đặt tất cả các cờ đó chỉ là cfmakeraw() các trường termios.
cũng đồng bộ hóa(); mà không có bất kỳ tham số nào (NOT fsync!;) dường như gửi tất cả các kết quả đang chờ xử lý tới TẤT CẢ các trình ghi, không chỉ chặn các thiết bị. cũng tcp sockets and rs232 ..
và cũng mở() có một tùy chọn O_SYNC (O_SYNC và O_ASYNC có các tên khó hiểu nhưng không liên quan gì đến giao thức dòng nối tiếp đang được định giờ hay không, lệnh này ngay lập tức cam kết write() ' s và người kia tạo ra một tín hiệu cho bẫy khi đầu vào trở nên có sẵn (kinda như rS232 dựa irq trên dos;)
thiết O_SYNC trong open() có thể đã khắc phục sự cố
cũng 'bằng cách đọc dữ liệu. ở đầu kia '... có những thứ gọi là' led 'và' resistors 'mà bạn có thể kết nối với TXD và SEE dữ liệu;) cũng có những thứ gọi là' rs232 breakout box 'hoặc một phạm vi có thể làm cho nó - trực tiếp có thể nhìn thấy-;) dễ dàng hơn nhiều so với 'đoán' bên nào không hoạt động đúng cách.
CẢNH BÁO: DID NOT TEST CODE. nó biên dịch. nhưng tôi có tất cả các cáp ttyUSB0 của tôi trong một tòa nhà khác. nhưng tôi nghĩ vấn đề chính của bạn là O_SYNC. thiết lập tất cả các thuật ngữ crap thành 0 là khá nhiều giống như cfmakeraw() ... cũng tại sao thiết lập CREAD nếu bạn sẽ mở nó chỉ viết? (tại sao mở nó chỉ viết chứ không phải là ghi đè dù sao? - và cũng với chỉ viết bạn sẽ không phải sợ nó trở thành một tty kiểm soát (O_NOCTTY;) vì vậy trong trường hợp chỉ viết, điều đó không chính xác cần thiết, hoặc .. .
chỉ nhận thấy% i (tương tự cho% d btw) định dạng cũng gây nên một loại không phù hợp cảnh báo giá trị ssize_t trở lại của write() để đúc đó để (int)
#include<termios.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
void main(){
int fd;
struct termios tty;
fd=-1;
while(fd<0){fd=open("/dev/ttyUSB0",O_WRONLY|O_NONBLOCK|O_NOCTTY|O_SYNC);sleep(1);};
cfmakeraw(&tty);
tty.c_cflag=CREAD|CRTSCTS|HUPCL|CS8;
cfsetospeed(&tty,B19200);
cfsetispeed(&tty,B19200);
tcsetattr(fd,TCSANOW,&tty);
printf("Write: %i\n",(int)write(fd,"HELLO",5));
sync();//if all else fails, also try without, O_SYNC should already fix that.
close(fd);
};
bạn có kiểm tra ' Giá trị trả về tcsetattr' – jweyrich
tcsetattr trả về 0 – Ryan
Bạn nói "HELLO" có ** dường như ** được gửi khi hàm write() được gọi. Bạn thiết lập chính xác điều này như thế nào? Bạn có chắc chắn nó không được gửi ngay lập tức không? và thiết bị không được xử lý i t? –