1

RS-232 経由で通信する Keyence カメラを使用しています。トリガーされたときに 3 つの整数値を出力するように構成されています。整数値の読み取りに問題があります。char 配列バッファを使用しようとしましたが、出力の最初の + 記号しか読み取れません。パテを使用してテストしたところ、出力は次のようになります

+346.0,+261.0,098

これらのような整数値を読み取るために使用する必要があるものがあるかどうかを知りたいですか?

    static void Main(string[] args)
    {

        char[] buffer1 = new char[200] ;


        SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);

        port.Open();
        if (port.IsOpen) { Console.WriteLine("port is now open"); } else { Console.WriteLine("port not opened correctly"); }

        port.Write("T"); //triggers the camera

        port.Read(buffer1, 0, 200);

        for (int i = 0; i < 200; i++)
        {
            Console.WriteLine(buffer1[i]);
        }
        Console.ReadLine();
    }
4

3 に答える 3

0

これは私が使用するコードです(簡略化):

public class Scanner : SerialPort
{
    private string _word;
    private int _globalCounter;
    private readonly char[] _rxArray = new char[2047];

    public Scanner()
    {
        DataReceived += MyDataReceivedEventHandler;
    }

    public event EventHandler<CodeScannedEventArgs> CodeScanned;
    private void MyDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
    {
        do
        {
            var rxByte = (byte)ReadByte();

            // end of word
            if (rxByte == 10)
            {
                // first byte (02) and last two bytes (13 and 10) are ignored
                _word = new string(_rxArray, 1, _globalCounter - 2);

                DisplayData(_word);

                _globalCounter = 0;
            }
            else
            {
                _rxArray[_globalCounter] = (char)rxByte;
                _globalCounter++;
            }
        } while (BytesToRead > 0);
    }

    private void DisplayData(string receivedText)
    {
        OnCodeScanned(new CodeScannedEventArgs(receivedText));
    }

    protected void OnCodeScanned(CodeScannedEventArgs e)
    {
        EventHandler<CodeScannedEventArgs> handler = CodeScanned;

        if (handler != null)
        {
            handler(this, e);
        }
    }
}

私が使用しているスキャナーは、スキャンするすべてのものにプレフィックスとしてバイト02を追加し、ポストフィックスとしてバイト13と10を追加するので、単語に分割するのは非常に簡単です。実装を少し変更して、うまく機能するようにする必要があることは明らかです。

編集-CodeScannedEventArgsクラス:

public class CodeScannedEventArgs : EventArgs
{
    public CodeScannedEventArgs(string scannedCode)
    {
        ScannedCode = scannedCode;
    }

    public string ScannedCode { get; set; }
}
于 2012-07-27T15:58:36.703 に答える
0

シリアルポートからの読み取りで、期待されるすべてのものを読み取らないという問題が以前に発生しました。

デバイスからの応答を読んでいて、まだ書き込みが完了していないことがわかりました。シリアル ポート オブジェクトは、読み取りタイムアウトに達するまでバッファをいっぱいにしようとし続けるだろうと考えましたが、それは実際には起こっていませんでした。

私のシナリオでは、シリアル ポートから読み取る文字数はわかっていました。したがって、文字バッファがいっぱいになるまで読み取りを繰り返すことができることがわかっている場合。SerialPort.BaseStream から読み取っている場合に同じことが当てはまるかどうかはわかりません。

SerialPort serialPort; 

char[] buffer = new char[expectedLength];
int totalBytesRead = 0;

//continue to read until all of the expected characters have been read
while (totalBytesRead < expectedLength)
{
    totalBytesRead += serialPort.Read(buffer, totalBytesRead, expectedLength - totalBytesRead); 
}
于 2012-07-27T15:49:14.190 に答える
0

port.ReadTo("\r") を使用しましたが、出力がキャリッジ リターンで終了するため、機能します。

しかし、データ受信イベントを使用する利点は何ですか?

于 2012-07-27T20:56:54.860 に答える