none
請問如何使用SerialPort在行動裝置上 RRS feed

  • 問題

  •  

    我爬了不少文....看起來似乎都得用BackgroundWorker
    但行動裝置裡並沒有BackgroundWorker....(開Windows ce 5.0專案)
    目前卡在資料無法顯示出來...
    我需要做一個條碼機讀條碼透過COM5傳回行動裝置上並顯示出來
    麻煩大大們給些建議>_<
    2008年6月11日 上午 07:49

解答

  • 這是我的程式 (.NET CF 2.0, Windows Mobile Pocket PC 2003) :

     

    Code Snippet

    public Reader(int SerialPortNumber, int PollSecounds)
    {
        this._port = new SerialPort(string.Format("COM{0}:", SerialPortNumber),
            9600, Parity.None);
        this._port.Handshake = Handshake.None;
        this._port.ReadBufferSize = 8;
        this._port.DtrEnable = true;
        this._port.RtsEnable = false;
        this._port.ReceivedBytesThreshold = 8;

        this._port.StopBits = StopBits.One;

     

        _pollTimer = new Timer();
        _pollTimer.Tick += new EventHandler(PollTimer_Tick);

     

        if (PollSecounds > 0)
            _pollTimer.Interval = PollSecounds;
        else
            _pollTimer.Interval = 50;
    }

     

    void PollTimer_Tick(object sender, EventArgs e)
    {
        string buffer = this._port.ReadExisting();

        if (buffer.Length > 0)
        {
            ReadDataEventArgs arg = new ReadDataEventArgs();
            arg.Data = buffer;
            ReadData(this, arg);
        }
    }

     

     

    2008年6月11日 上午 09:55
  • 你要看通訊協定,機器回傳的不一定是ASCII Code,ReadExisting會傳回字串,緩衝區資料不是字串格式的話轉出來就是空值了,用Read去收到byte陣列試試看

    2008年6月11日 下午 12:01
    版主

所有回覆

  • 看不懂...用Backgroundworker是想要做什麼動作?使用serialport去傳/收資料就可以了不是嗎?

     

    移文到 行動與嵌入式裝置開發(Mobile & Embedded System Development)

    2008年6月11日 上午 08:34
    版主
  • 請問你是用什麼裝置去讀取條碼?

    內建的紅外線,還是有其他外接裝置?

    開 Serial Port 要先知道是用什麼方式開呀?

    還有請告知 開發環境是什麼?C# VB ?

    VS2003 跟 VS2005 都有內建 SerialPort 元件可以使用了!
    2008年6月11日 上午 08:47
  • 2003 (.NET 1.x) 沒有內建的。

    2005 (.NET 2.0) 開始才有。

     

    讀條碼也用不到 BackgroundWorker 吧,除非你的條碼機慢到 10 秒鐘一個字元 ... 但這種條碼機你會用嗎?

    2008年6月11日 上午 08:56
  • 不好意思....沒描述清楚,

    我是用VS2005所以我把文放在Visual Basic

     

    Code Snippet

    Public Class frmOpen
        Dim Temp As String

        Private Sub frmOpen_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer.Enabled = True
        End Sub

        Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
            Temp = SerialPort.ReadExisting
        End Sub

        Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer.Tick
            If SerialPort.IsOpen = True Then
                Label1.Text = "OPEN"
            Else
                Label1.Text = "CLOSE"
            End If
        End Sub

        Private Sub btnOpen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOpen.Click
            SerialPort.Open()
        End Sub

        Private Sub btnClose_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClose.Click
            SerialPort.Close()
        End Sub

        Private Sub btnGet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGet.Click
            txtReceive.Text = Temp
        End Sub
    End Class

     

     

    我有用SerialPort的元件...這也只是一個簡單的程式

    但是就是在資料要進來的時候

    我不知道怎麼去收.....煩請各位大大指點迷津

    2008年6月11日 上午 09:01
  • 如果你的問題是在DataReceived事件中去變更UI,而發生錯誤(存取控制項 control name 時所使用的執行緒與建立控制項的執行緒不同),不知道怎麼處理的話,可以參考一下璉大這篇

     

    [VB2005]工作緒變更畫面控制項的值

    http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1440.entry

    2008年6月11日 上午 09:09
    版主
  • 我是用 Timer + SerialPort.ReadExisting() 去讀來自 COM port 的資料,可以不受 Thread 的影響。

     

    2008年6月11日 上午 09:23
  •  bauann 寫信:

    如果你的問題是在DataReceived事件中去變更UI,而發生錯誤(存取控制項 control name 時所使用的執行緒與建立控制項的執行緒不同),不知道怎麼處理的話,可以參考一下璉大這篇

     

    [VB2005]工作緒變更畫面控制項的值

    http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1440.entry

     

    其實也不是....只是單純用條碼機掃條碼......但我找不到方法秀出我掃到的條碼

    然後上網有看到很多人在用BackgroundWorker....其實我也不是很懂...@_@

    想請問的是掃到的條碼是放在SerialPort.ReadExisting這裡嗎

    還是說在哪裡.....

    2008年6月11日 上午 09:30
  •  小朱 寫信:
    我是用 Timer + SerialPort.ReadExisting() 去讀來自 COM port 的資料,可以不受 Thread 的影響。

     

     

    我在Timer_Tick裡加了一段

     

    Code Snippet

    If SerialPort.IsOpen = True Then
                If SerialPort.ReadExisting.Length > 0 Then
                    txtReceive.Text = SerialPort.ReadExisting
                End If
            End If

     

     

    不過...還是沒顯示出來.....是我哪裡寫錯嗎@_@
    2008年6月11日 上午 09:42
  • 這是我的程式 (.NET CF 2.0, Windows Mobile Pocket PC 2003) :

     

    Code Snippet

    public Reader(int SerialPortNumber, int PollSecounds)
    {
        this._port = new SerialPort(string.Format("COM{0}:", SerialPortNumber),
            9600, Parity.None);
        this._port.Handshake = Handshake.None;
        this._port.ReadBufferSize = 8;
        this._port.DtrEnable = true;
        this._port.RtsEnable = false;
        this._port.ReceivedBytesThreshold = 8;

        this._port.StopBits = StopBits.One;

     

        _pollTimer = new Timer();
        _pollTimer.Tick += new EventHandler(PollTimer_Tick);

     

        if (PollSecounds > 0)
            _pollTimer.Interval = PollSecounds;
        else
            _pollTimer.Interval = 50;
    }

     

    void PollTimer_Tick(object sender, EventArgs e)
    {
        string buffer = this._port.ReadExisting();

        if (buffer.Length > 0)
        {
            ReadDataEventArgs arg = new ReadDataEventArgs();
            arg.Data = buffer;
            ReadData(this, arg);
        }
    }

     

     

    2008年6月11日 上午 09:55
  • 想請問小朱大大

    Dim arg As ReadDataEventArgs = New ReadDataEventArgs
    arg.Data 
    buffer
    ReadData(
    Me, arg)
    這三行的意思是啥....我是用VB.NET似乎沒有對應的函數

    不好意思....第一次接觸...很多觀念不懂...請多包含@_@

    2008年6月11日 上午 10:52
  • 那是事件引發的作法。

    不過你用不到事件,可以用你自己的程式取代。

     

    2008年6月11日 上午 10:54
  •  小朱 寫信:

    那是事件引發的作法。

    不過你用不到事件,可以用你自己的程式取代。

     

     

    Code Snippet

    If SerialPort.IsOpen = True Then
                If SerialPort.ReadExisting.Length > 0 Then
                    Temp = SerialPort.ReadExisting
                End If
            End If

     

     

    掃條碼時SerialPort.ReadExisting.Length有大於0,但SerialPort.ReadExisting卻是空值=__=

    我要暈倒了....還是說有啥設定要設,還是說我是用RS232轉USB所以有影響@__@

    2008年6月11日 上午 11:39
  • 你要看通訊協定,機器回傳的不一定是ASCII Code,ReadExisting會傳回字串,緩衝區資料不是字串格式的話轉出來就是空值了,用Read去收到byte陣列試試看

    2008年6月11日 下午 12:01
    版主
  •  bauann 寫信:

    你要看通訊協定,機器回傳的不一定是ASCII Code,ReadExisting會傳回字串,緩衝區資料不是字串格式的話轉出來就是空值了,用Read去收到byte陣列試試看

     

    喔喔....原來如此....

    對於byte陣列不是很熟@_@...看來要去多爬爬文

    很感謝各位大大的指教

     

     

    2008年6月12日 上午 02:34
  • 請問一下在vs2005上是用 System.io.port.比較好或是用 .NET CF 2.0  ?

    可否建議一下

    flair
    2009年11月9日 下午 05:09
  • 請問一下在vs2005上是用 System.io.port.比較好或是用 .NET CF 2.0  ?

    可否建議一下

    flair

    System.IO.Ports是一個命名空間, .NET Compact Framework 2.0是一個框架, 這不是兩個互斥的東西.

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月10日 上午 05:03