Mình đang thử dùng UART theo kiểu polling. Chạy rất ổn.
Đây là đoạn code sử dụng:
//----------------------------------------------------------------------
BOOL ReceiveByte()
{
BYTE bRxStatus;
// Wait to receive full byte
while ( !( bRxStatus=UART_1_bReadRxStatus() & UART_1_RX_COMPLETE ) );
// data received, now check for errors
if (( bRxStatus & UART_1_RX_NO_ERROR ) == 0 )
{
// no error detected
bRxData = UART_1_bReadRxData();
return( TRUE );
}
else
{
// error detected
bRxData = bRxStatus;
return( FALSE );
}
}
//-------------------------------------------------------------
void TransmitByte( BYTE data )
{
// check for the end condition, before sending the next byte
while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ));
UART_1_SendData(data);
}
- Trong chương trình chính mình có viết như sau:
void main(void)
{
Data=0x32;
.....
.....
while (1)
{
TransmitByte(Data);
if (ReceiveByte())
{
if (bRxData==0x01) TransmitByte('a');
if (bRxData==0x02) TransmitByte('b');
}
}
}
Nhưng khi cho giao tiếp với phần mềm thì mình thấy rằng:
- Ban đầu khi chạy nó truyền một lần 0x32 (ứng với data), sau đó ko thấy gì nữa. Khi mình gửi 0x01 hoặc 0x02 thì nó sẽ truyền về 'a' và 0x32 hoặc 'b' và 0x32.
Tại sao lại như vậy? Ý mình thì muốn nó truyền liên tục 0x32 và nếu nó nhận được 0x01 thì nó sẽ gửi trả 'a' hoặc 0x02 thì gửi trả 'b'.
- Như mình hiểu với đoạn code kia nó sẽ truyền 0x32. Sau đó nó kiểm tra xem có nhận đc byte nào không, nếu nhận được thì sẽ thực hiện bên trong và nếu không thì sẽ bỏ qua và quay trở lại vòng quét và truyền 0x32.
- Nhưng nó lại không như y mình, nó lại đợi ở câu lệnh: if (ReceiveByte())
- Bác encoder xem giúp em vấn đề này với, em đã sai ở chỗ nào. và nếu có sai thì em phải viết lại thế nào cho nó đúng? Mong bác giúp đỡ. Hoặc nếu bác nào biết xin giúp em một tay.
ps: hôm trước em đã thử theo cách của bác encoder là dùng DUAL ADC, và đã chạy rất ổn, cảm ơn bác rất nhiều.
Đây là đoạn code sử dụng:
//----------------------------------------------------------------------
BOOL ReceiveByte()
{
BYTE bRxStatus;
// Wait to receive full byte
while ( !( bRxStatus=UART_1_bReadRxStatus() & UART_1_RX_COMPLETE ) );
// data received, now check for errors
if (( bRxStatus & UART_1_RX_NO_ERROR ) == 0 )
{
// no error detected
bRxData = UART_1_bReadRxData();
return( TRUE );
}
else
{
// error detected
bRxData = bRxStatus;
return( FALSE );
}
}
//-------------------------------------------------------------
void TransmitByte( BYTE data )
{
// check for the end condition, before sending the next byte
while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ));
UART_1_SendData(data);
}
- Trong chương trình chính mình có viết như sau:
void main(void)
{
Data=0x32;
.....
.....
while (1)
{
TransmitByte(Data);
if (ReceiveByte())
{
if (bRxData==0x01) TransmitByte('a');
if (bRxData==0x02) TransmitByte('b');
}
}
}
Nhưng khi cho giao tiếp với phần mềm thì mình thấy rằng:
- Ban đầu khi chạy nó truyền một lần 0x32 (ứng với data), sau đó ko thấy gì nữa. Khi mình gửi 0x01 hoặc 0x02 thì nó sẽ truyền về 'a' và 0x32 hoặc 'b' và 0x32.
Tại sao lại như vậy? Ý mình thì muốn nó truyền liên tục 0x32 và nếu nó nhận được 0x01 thì nó sẽ gửi trả 'a' hoặc 0x02 thì gửi trả 'b'.
- Như mình hiểu với đoạn code kia nó sẽ truyền 0x32. Sau đó nó kiểm tra xem có nhận đc byte nào không, nếu nhận được thì sẽ thực hiện bên trong và nếu không thì sẽ bỏ qua và quay trở lại vòng quét và truyền 0x32.
- Nhưng nó lại không như y mình, nó lại đợi ở câu lệnh: if (ReceiveByte())
- Bác encoder xem giúp em vấn đề này với, em đã sai ở chỗ nào. và nếu có sai thì em phải viết lại thế nào cho nó đúng? Mong bác giúp đỡ. Hoặc nếu bác nào biết xin giúp em một tay.
ps: hôm trước em đã thử theo cách của bác encoder là dùng DUAL ADC, và đã chạy rất ổn, cảm ơn bác rất nhiều.
Comment