none
串列傳輸疑問 RRS feed

  • 問題

  • 請問大家一下

    下面是我寫的RS232的程式碼

    如果baudrate設為2400沒有問題

    設成9600就會有問題

    例如:應該收到0111 1111---卻收成1011 1111

    請大家給點建議

    謝謝

     

    ---------------------------------------------------------------------------------

    Imports System
    Imports System.IO.Ports
    Public Class Form1
        Dim num() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
        Dim num_ori As Integer
        Dim WithEvents RS232_port As SerialPort = New  _
         System.IO.Ports.SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            CheckForIllegalCrossThreadCalls = False
            If RS232_port.IsOpen = False Then RS232_port.Open()
        End Sub

        Private Sub port_DataReceived(ByVal sender As Object, ByVal e As  _
           System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232_port.DataReceived
            TextBox1.Text = ""
            TextBox1.Text = RS232_port.ReadByte     'UART 接收一個位元資料

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            num_ori = num_ori + 1
            RS232_port.Write(num(num_ori))          'UART 傳送一個位元資料
        End Sub
    End Class

    2010年10月8日 上午 06:39

解答

  • 這種問題其實有點棘手, 因為問題可能出在

    (1) 設備端回應時出錯, 也就是他送來來資料根本是錯的

    (2) 線路干擾. 因為RS232訊號準位是對接地的, 如果接地受干擾也會出錯

    (3) 你可能某個參數調錯, ex: Stop Bits, Parity ...


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月8日 上午 07:15
    版主

所有回覆

  • 實體線路的接法是 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月8日 上午 06:42
    版主
  • pc透過COM1與8051相接

    8051接MAX232再接DB9

    謝謝

     

    2010年10月8日 上午 06:51
  • 所以你兩端 (包含設備端)的RS232 參數設定有先確認OK嗎 ?
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月8日 上午 06:53
    版主
  • 因為設成2400就是正常收發資料,所以很奇怪

    下面是單晶片的

    謝謝

    ------------------------------------------------

    #include<REGX51.h>
    //#include<stdio.h>
    void RS232_init();
    void delay_1X(unsigned int X);
    unsigned char BT_buf;
    main(){
     RS232_init();
     while(1){
      BT_buf=P1;   //input
      //putchar(BT_buf); //send
      SBUF=BT_buf;  //send
      delay_1X(1000); 
     }
    }
    //---RS232 initialized------------
    void RS232_init(){
     TMOD=0x20;
     SCON=0x52;
     TH1=0xfd;   //12MHz---2400:0xf3---9600: 0xfd
     PCON=PCON & 0x7f;
     IE=0x90;
     TR1=1;
    }
    //---delay 1mS*X------------------
    void delay_1X(unsigned int X){
      unsigned int i,j;
     for(i=0;i<X;i++)
      for(j=0;j<120;j++);
    }
    //----UART- service---
    void RS232_service(void) interrupt 4
    {
     if(RI==1){
      RI=0;
      P0=SBUF;
     }else{
      TI=0; //傳送中斷
     }
    }

    2010年10月8日 上午 07:01
  • 這種問題其實有點棘手, 因為問題可能出在

    (1) 設備端回應時出錯, 也就是他送來來資料根本是錯的

    (2) 線路干擾. 因為RS232訊號準位是對接地的, 如果接地受干擾也會出錯

    (3) 你可能某個參數調錯, ex: Stop Bits, Parity ...


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月8日 上午 07:15
    版主
  • 謝謝大家幫忙--------------------------

    單晶片如果使用的OSC=12MHz

    Baudrate不可設為9600

    因為無法整除

    信號就會不準

    收發的資料就會有問題

    解決了

    2010年10月8日 上午 07:32