2012-08-10 3 views
0

컴퓨터 (VB.NET)에서 직렬 연결 AT89s52로 파일을 보내야합니다.
보낸 바이트마다 마이크로 컨트롤러에서해야 할 일이 있습니다. 시간이 필요합니다. 여기
는 수신 바이트 내 C 코드의 관련 부분입니다 :8051 UART, 연속적으로 바이트 수신

SCON = 0x50; 
TMOD = 0x20; // timer 1, mode 2, 8-bit reload 
TH1 = 0xFD; // reload value for 9600 baud 
TR1 = 1; 
TI = 1; 

again: 

     while(RI!=0) 
     { 
      P1=SBUF;   // show data on led's 
      RI=0; 
      receivedBytes++; 
     } 

     if (key1==0) 
     { 
      goto exitreceive; // break receiving 
     } 

     show_lcd_received_bytes(receivedBytes); 
     // here is one more loop 
     // with different duration for every byte 
     goto again; 

그리고 여기에 보내는 바이트 VB.NET 코드 :

For a As Integer = 1 To 10 
     For t As Integer = 0 To 255 
      SerialPort1.Write(Chr(t)) 
     Next t 
    Next a 

문제가 MC는 모든 후해야 할 몇 가지 일을해야한다는 것입니다 받은 바이트와 VB.NET은이를 알지 못하고 바이트를 너무 빨리 보내므로 mC에서 모든 바이트의 일부만 완료합니다 (약 10 %). VB 루프 개미에 "Sleep (20)"을 포함시킬 수는 있지만, 모든 바이트가 처리하기 위해 다른 시간이 필요하고 용납 될 수없는 느린 통신이되기 때문에 시간 낭비가 많습니다.

지금, 제 질문은 8051이 VB가 바이트를 보내거나 보내기로 결정하기 전에 읽을 수있는 UART에서 일부 사용 중 상태를 설정할 수 있는지입니다. 설명 된대로 통신을 어떻게 설정해야합니까? 동일한 결과로 mC 측에서 직렬 인터럽트로 바이트를 수신하려고합니다.

데이터를 잘 컴퓨터로 보낼 수 있기 때문에 하드웨어가 정상적으로 작동합니다.

+1

전송 속도를 낮 춥니 다. –

+0

통신이 제대로 작동하면 통신 속도를 낮추는 이유는 무엇입니까? –

+1

마이크로 컨트롤러가 계속 유지할 수 없어 데이터의 90 %를 잃게되면 일반적으로 "통신이 제대로 작동합니다"라고 말하지 않습니다. –

답변

1

문제는 아키텍처입니다. 바이트 Rx를 처리하는 인터럽트에서 수신 된 데이터에 대한 처리를 시도하지 마십시오. 바이트 수신 Rx 인터럽트는 수신 된 바이트를 별도의 Rx 데이터 버퍼로 복사하고 Rx 인터럽트 처리기를 차단하지 않고 수신 데이터의 실제 처리를 수행하는 백그라운드 작업을 수행해야합니다. 전체 처리량 문제로 인해 유지할 수 없다면 RTS/CTS 흐름 제어가 적절한 메커니즘입니다. 예를 들어, Rx 버퍼가 90 % 찼을 때 흐름 제어 신호를 비활성화하여 송신 측을 일시 중지합니다.

+0

예, 제가 언급했습니다. 하지만 이미 TX/RX 용 MAX232를 사용하는 방법에는 RTS/CTS 신호 구현에 사용할 수있는 2 개의 I/O 쌍이 있습니다. 나는이 분야에서 새로운 편이다. 아마도 8051 UART는 이미 핸드 쉐이킹 데이터 흐름을위한 정비공을 가지고있을 것이다. 이제 상황이 좀 더 명확 해집니다. 고맙습니다. –

1

과거로부터의 폭발, 나는이 종류의 물건을 디버깅하는 직렬 회선 추적기에 브레이크 아웃 상자를 사용하는 것을 기억합니다.

직렬 통신을 사용하는 경우 모든 핀/와이어를 사용하면 RTS (준비 보내기) 및 DTR (데이터 터미널 준비)을 통한 흐름 제어로 더 많은 데이터를 전송할 수 있다고 신호를 보내는 데 사용됩니다 . C를 통해 코딩하는 장치에서 제어 할 수 있습니까? VB.NET에는 이러한 신호를 수신하는 데 사용되는 이벤트가 있거나 SerialPort 객체의 속성을 사용하여 쿼리 할 수 ​​있습니다.

+0

글쎄 tcarvin, 나는 그 장치를 제어 할 수 있지만 그것이 RTS와 DTR 비트의 설정과 그것을 설정하는 방법을 지원하는지 모르겠습니다. 사실, 정확하게 이것은 8051의 숙련 된 사용자에게의 원래 질문이었습니다. –

1

@TJD는 하드웨어 흐름 제어를 사용하여 마이크로 컴퓨터가 수신 된 바이트를 처리하는 동안 PC가 문자를 전송하는 것을 막을 수 있다고 언급합니다. 과거에는 사용 가능한 포트 라인을 출력으로 사용하여 하드웨어 흐름을 구현했습니다. 출력을 TTL-RS-232 드라이버에 연결해야합니다 (현재 사용중인 RS-232 및 추가 드라이버를 사용할 수있는 경우). USB 가상 직렬 포트 또는 RS-422/485를 사용하는 경우 소프트웨어 흐름 제어를 구현해야합니다. 일반적으로 PC에 송신을 중지하고 Ctrl-Q를 계속하려면 제어 -S가 전송됩니다. 흐름 제어를 최대한 활용하려면 문자를 수신/전송하기 위해 완전 인터럽트 기반 FIFO를 구현해야 할 가능성이 높습니다.

하드웨어 흐름 제어와 관련된 추가 정보를 원하시면 http://electronics.stackexchange.com을 확인하십시오.

+0

조언 해 주신 Jeff에게 감사드립니다. 내 보드에는 TTL/RS232 변환 (운좋게도)이 두 신호에 대한 정확한 작업을 수행 할 수있는 무료 리소스가 있습니다. –

0

이러한 많은 답변은 하드웨어 흐름 제어를 제안하지만 소프트웨어 흐름 제어를 사용하여 전송 성능을 향상시킬 수 있습니다. 현재는 통신이 강력하지만 더 높은 보오율 또는 더 먼 거리를 실행하기 시작하거나 잡음이있는 연결 만있는 경우에도 올바르지 않은 문자를 수신하거나 문자를 버릴 수 있습니다.

발생하도록 설정된 모든 작업이 완료되면 간단한 2 바이트 ACK 시퀀스를 추가 할 수 있습니다. 그것은이 같은 것을 볼 수 있었다 :

: < × 00> 장치가 실행 장치를 필요 어떤 행동 (결과에 따라) ACK/NAK 바이트를 전송 : < × 00> 장치가 명령 바이트가 메아리 :

호스트는 명령 바이트를 전송

이렇게하면 통신이 중단되는지 호스트 측에서 볼 수 있습니다. 에코 된 문자는 전송 된 내용과 불일치 할 수 있으며 문제를 경고합니다. 또한 문자가 일부 제한 시간 내에 호스트에 의해 수신되지 않으면 호스트는 재전송을 시도 할 수 있습니다. 마지막으로, ACK/NAK는 상태를 반환하는 옵션을 제공하지만 가장 중요한 것은 호스트가 사용자가 작업을 완료했으며 다른 명령을 보낼 수 있음을 알릴 것입니다.

수신 된 명령이 유효한지 확인하는 방법을 장치에 제공하기 위해 체크섬을 포함하도록 확장 할 수 있습니다 (명령 바이트와 함께 보내는 간단한 논리 역으로도 충분 함).

이 솔루션의 장점은 하드웨어 흐름 제어를 위해 양쪽 끝에 여분의 회선 또는 UART 지원이 필요 없다는 것입니다.