2014-07-21 13 views
6

Tôi đang cố gắng để gửi/nhận một chuỗi thông qua C#, C# tôi chỉ cần làm:SerialPort & CCS Chuỗi Truyền

SerialPort.WriteLine("A6"); 

nhưng trong CCS, nếu tôi cố gắng gửi một chuỗi char sau char nó không làm việc ở tất cả, không phải với ReadLine cũng như với ReadExisting! Đây là những gì tôi đã thử tạo một mảng, vì vậy mỗi khi chúng ta nhập pragma RXBUFF, chúng ta thêm char đã nhận vào mảng, cho đến khi mảng đầy (tôi xác định ngẫu nhiên kích thước mảng là 2, có nghĩa là chúng ta đối phó với 2 -char dài chuỗi), và cuối cùng là gửi chuỗi bằng cách gửi char sau char:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 

if(__even_in_range(UCA1IV,18) == 0x02){   // Vector 2 - RXIFG 
    if(counter==0) 
    { 
     Data[0]=UCA1RXBUF; 
     counter++; 
    } 
    else 
    { 
     Data[1]=UCA1RXBUF; 
     counter=0; 
     UCA1TXBUF=Data[0]; 
     while(!(UCA1IFG & UCTXIFG)); // until UCTXBUF1 is empty 
     UCA1TXBUF=Data[1]; 
    } 
} 

trong C#:

listBox2.Items.Add(SerialPort.ReadExisting()); 

tôi nhận được văn bản không có ý nghĩa, như: ?? Một ??? đôi khi: ???? A? vv .., nhưng với:

listBox2.Items.Add(SerialPort.ReadLine()); 

trong lần đầu tiên tôi bấm nút Gửi đó gửi "A6", tôi nhận được gì, lần thứ hai tôi nhận được không có ý nghĩa là tốt, giống như hành vi ReadExisting.

bằng cách này, ngay cả khi tôi cố gắng để gửi chuỗi theo cách đơn giản nhất (không có mảng và điều kiện), tôi có nghĩa như thế này:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 
     UCA1TXBUF='A'; 
     while(!(UCA1IFG & UCTXIFG)); // until UCTXBUF1 is empty 
     UCA1TXBUF='6'; 

tôi cũng có được mặt hàng không phù hợp trong listbox.

Tuy nhiên, nếu tôi làm điều này:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 
UCA1TXBUF=UCA1RXBUF; 

tôi làm được "A6" trong listbox và tất cả mọi thứ chỉ hoạt động tốt (với ReadLine ReadExisting)! ai cũng có thể cho tôi biết tại sao điều này xảy ra?

+0

http://electronics.stackexchange.com/questions/71810/uart-is-garbled-when-running-at-more-than-9600-bps –

+0

Bạn đã xác nhận rằng Tốc độ truyền và các thuộc tính khác được khớp lên? –

+0

Có! nếu các thuộc tính không khớp với nhau, tôi đoán lần thử cuối cùng sẽ không hoạt động, nhưng nó hoạt động. bạn không đồng ý với tôi –

Trả lời

1

I'v chỉ vô hiệu hóa các bit chẵn lẻ, tất cả mọi thứ hoạt động ngay bây giờ, cảm ơn tất cả!

0

Điều này cho biết bạn không nên chờ cờ TX bên trong RX ISR. Các thói quen gián đoạn RX chỉ đơn giản là điền vào một bộ đệm FIFO (một hàng đợi byte), để bạn có thể phân tích nội dung của nó ở một nơi khác (thói quen chính?), Và sau đó tạo ra một phản ứng khi cần thiết.

Pseudo code cho RX ISR nên một cái gì đó như:

#pragma vector = USCI_A1_VECTOR 
__interrupt void USCI_A1_ISR(void) 
FIFO_Enqueue(&RxBuffer, UCA1RXBUF); 

Và ở đâu đó bên trong main() vòng lặp bạn có thể phân tích nội dung của nó:

while (1) 
{ 
    // find the first occurrence of "A6" and dequeue it 
    if (FIFO_StartsWith(&RxBuffer, "A6") 
     SendResponse(); 
} 
+1

Bạn nói đúng, nó điền vào một buff FIFO, và đó là những gì tôi đang làm bằng cách sử dụng mảng, mà tôi không nghĩ rằng vấn đề của nó, nhưng tôi vẫn không hiểu sự khác biệt giữa gửi các ký tự trong ISR hoặc chính!dù sao tôi đã thử như bạn đã nói: http://postimg.org/image/cggftjfdl/ nhưng nó không hoạt động tốt. –

+0

sau khi trung hòa bit chẵn lẻ tất cả mọi thứ hoạt động tốt nhưng chỉ trong thói quen ISR và không phải trong chính (cũng chỉ với ReadExisting nhưng không phải với ReadLine), làm thế nào lạ! –

Các vấn đề liên quan