Tôi đang thực hiện một vi điều khiển 8051 giao tiếp không dây với máy tính. Bộ vi điều khiển sẽ gửi một chuỗi đến cổng nối tiếp của nó (DB9) và máy tính sẽ nhận được chuỗi này và thao tác nó.Tôi làm cách nào để gửi chuỗi từ seri 8051 chỉ ONCE?
Vấn đề của tôi là tôi không biết cách làm cho 8051 truyền chuỗi chỉ một lần. Vì tôi cần thao tác chuỗi ở đầu PC nên nó chỉ được nhận một lần. Hiện tại, mặc dù trong mã C tôi đang gửi chuỗi một lần, trên máy tính của tôi, tôi nhận được cùng một chuỗi liên tục. Tôi cho rằng điều này là bởi vì bất cứ điều gì trong SBUF được truyền liên tục. Có cách nào để tôi chỉ có thể gửi chuỗi của mình một lần không? Có cách nào để làm trống SBUF không?
Tôi đã cố gắng sử dụng chân RTS (Yêu cầu gửi) (pin thứ 7) trên DB9 vì tôi đọc ở đâu đó nếu tôi phủ nhận điện áp trên chốt đó, nó sẽ dừng luồng dữ liệu vào cổng nối tiếp. Vì vậy, những gì tôi đã làm được lập trình vi điều khiển của tôi để gửi chuỗi và sau đó gửi logic cấp 0 đến một pin đầu ra đã được kết nối với pin RTS DB9 của tôi. Tuy nhiên, điều đó không hiệu quả.
Có ai có bất kỳ đề xuất nào không? Tôi thực sự đánh giá cao họ.
EDIT
Phần mềm tôi đang sử dụng trên PC là X-CTU cho mô-đun Xbee. Đây là mã trên vi điều khiển của tôi:
include reg51.h
void SerTx(unsigned char);
void main(void)
{
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
SerTx('O');
SerTx('N');
SerTx('L');
SerTx('Y');
}
void SerTx(unsigned char x)
{
SBUF = x;
while(TI==0);
TI = 0;
}
Ai đó có thể vui lòng xác minh rằng trên thực tế, chỉ gửi chuỗi một lần?
EDIT
Hình như Steve, brookesmoses và Neil nhấn đinh trên đầu khi họ nói rằng đó là những gì đã xảy ra sau khi chức năng chính của tôi đã gây ra vấn đề. Tôi vừa thử đoạn mã gợi ý mà Steve đưa lên (cụ thể hơn là (;;) và xác định serTX bên ngoài chính) và nó hoạt động hoàn hảo. Bộ điều khiển có thể được khởi động lại và do đó cùng một mã giữ lặp lại chính nó.
Cảm ơn bạn rất nhiều vì đã trợ giúp! :)
Phần mềm tôi đang sử dụng trên PC là X-CTU cho mô-đun Xbee. Đây là mã trên vi điều khiển của tôi: #include void SerTx (unsigned char); void main (void) { \t TMOD = 0x20; \t TH1 = 0xFD; \t SCON = 0x50; \t TR1 = 1; \t \t \t SerTx ('O'); \t SerTx ('N'); \t SerTx ('L'); \t SerTx ('Y'); \t void SerTx (unsigned char x) { \t SBUF = x; \t khi (TI == 0); \t TI = 0; } } Ai đó có thể vui lòng xác minh rằng trên thực tế, chỉ gửi chuỗi một lần? –
CodeConfused
Vui lòng chỉnh sửa câu hỏi của bạn và chèn mã, được định dạng dưới dạng mã để dễ đọc hơn. –
@CodeConfused: Tôi rất vui vì tất cả chúng tôi đã tìm được giải pháp! Tôi có thêm hai yêu cầu cho bạn. (1) Đối với câu hỏi này và tất cả các câu hỏi khác của bạn về Stack Overflow, vui lòng đánh dấu câu trả lời là "được chấp nhận" bằng cách nhấp vào dấu tích lớn bằng câu hỏi bạn cung cấp câu trả lời hay nhất cho câu hỏi của bạn. Điều này rất hữu ích cho những người khác có thể có cùng câu hỏi trong tương lai, vì họ có thể thấy ngay câu trả lời tốt nhất. (2) Trong câu hỏi này, hãy định dạng mã như mã. Để thực hiện việc này, hãy chỉnh sửa câu hỏi, chọn mã và nhấn nút mã (đó là nút có số 1 và số 0 trên đó). Cảm ơn. –