Mono 在运行时更改ttyAMA0串行波特率(单声道)

Mono 在运行时更改ttyAMA0串行波特率(单声道),mono,serial-port,raspberry-pi,baud-rate,Mono,Serial Port,Raspberry Pi,Baud Rate,通过TTYAM0串行连接的FPS传感器有问题。 开机时的默认速度为9600,但某些功能仅在115200时才能正常工作 所以我的要求是如何在运行时更改串行波特率。 我解释说我将C与MonoDevelop结合使用: 1我声明串行端口的波特率为9600 2我向FPS发送命令,将其波特率从9600更改为115200 3我将RaspBerry ttyAMA0波特率从9600更改为115200 4我继续向FPS发送其他命令 非常感谢您的关注。 再见 卢卡·蒙吉尼 代码是它被简化了,排除了一些控件,使它对您来

通过TTYAM0串行连接的FPS传感器有问题。 开机时的默认速度为9600,但某些功能仅在115200时才能正常工作

所以我的要求是如何在运行时更改串行波特率。 我解释说我将C与MonoDevelop结合使用:

1我声明串行端口的波特率为9600 2我向FPS发送命令,将其波特率从9600更改为115200 3我将RaspBerry ttyAMA0波特率从9600更改为115200 4我继续向FPS发送其他命令

非常感谢您的关注。 再见

卢卡·蒙吉尼

代码是它被简化了,排除了一些控件,使它对您来说更干净

//DECLARING SERIAL
public static SerialPort cbrSerial = new SerialPort("/dev/ttyAMA0", 9600, Parity.None, 8, StopBits.One);
cbrSerial.ReadTimeout = 20000;

//OPENING SERIAL
Console.WriteLine("OPEN Serial");
cbrSerial.Open();

//OPEN FPS COMMAND (MUST "OPEN FPS" BEFORE CHANGE ITSBAUDRATE!!!)
Console.WriteLine("OPEN FPS");
cbrSerial.Write (new byte[] {0x55,0xaa,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x01}, 0, 12);
Thread.Sleep(1000);

Console.WriteLine ("execute Baudrate change from default to 115200");
cbrSerial.Write (new byte[] {0x55,0xaa,0x01,0x00,0x80,0x25,0x00,0x00,0x04,0x00,0xa9,0x01}, 0, 12);
Thread.Sleep (3000);
//clearing the serial buffer
cbrSerial.DiscardInBuffer();


// HERE I'VE GOT TO CHANGE THE SERIALBAUDRATE FROM 9600 TO 115200
// BUT THIS COMMAND DOESN'T WORK!!!
cbrSerial.BaudRate=115200;

//THE LED SWITCH ON
Console.WriteLine("LED IS ON");
cbrSerial.Write (new byte[] {0x55,0xaa,0x01,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x13,0x01}, 0, 12);
Thread.Sleep(1000);


    int loops =0;
    string resp="";
    // looping the procedure (30 TIMES TO DEBUG IT)
    while (loops<30)
        {

        // ISPRESSFINGER command - verify if there is a finger on the FPS
        cbrSerial.Write (new byte[] {0x55,0xaa,0x01,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x27,0x01}, 0, 12);
        Thread.Sleep(1000);
        resp=check_get_data();
        Console.WriteLine(resp);

        // if a finger is on the FPS
        if (resp == "85|170|1|0|0|0|0|0|48|0|48|1|")
            {
            cbrSerial.DiscardInBuffer();

            //CAPTURE THE FINGER IMPRESSION AND STORE IT IN FPS INTERNAL RAM
            Console.WriteLine ("CAPTUREFINGER");
            cbrSerial.Write (new byte[] {0x55,0xaa,0x01,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x61,0x01}, 0, 12);
            Thread.Sleep(1000);

            //COMMAND THE TRANSMISSION BACK OF THE IMAGE
            Console.WriteLine("GETIMAGE");
            cbrSerial.Write (new byte[] {0x55,0xaa,0x01,0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x63,0x01}, 0, 12);
            Thread.Sleep(7000);

            //WRITE THE BYTE INTO A FILE ON THE RASPBERRY DESKTOP
            string strTemplate="";
            strTemplate=check_get_data();
            Console.WriteLine(strTemplate);
            StreamWriter a = new StreamWriter("/home/pi/Desktop/ConsoleResult.txt",true);
            a.Write (strTemplate);
            a.Close ();

            }

        loops = loops + 1;
        Thread.Sleep(1000);
        }

    //AT THE END OF THE LOOP SWITCH OFF THE LED
    Console.WriteLine("LED OFF");
    cbrSerial.Write (new byte[] {0x55,0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x12,0x01}, 0, 12);
    Thread.Sleep(3000);

    //COMMAND TO CLOSE FPS
    Console.WriteLine("FPS CLOSED");
    cbrSerial.Write (new byte[] {0x55,0xAA,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x01}, 0, 12);

//SERIAL CLOSE
cbrSerial.Close ();


    public static string check_get_data()
    {
    Console.WriteLine("READ BYTE:");
        byte tmpByte=0;
        string letto="";
        while (cbrSerial.BytesToRead !=0) {
            tmpByte=(byte)cbrSerial.ReadByte();
            letto=letto + System.Convert.ToString (tmpByte) + '|';
            }
        return letto;

    }
我自己解决了。 以下是获得测试波特率变化的步骤:

1在9600处声明第一个串行MySerial 2在115200处声明第二个串行mySerialH 3开放式MySerial 4向传感器发送打开命令 5向传感器发送命令CHANGEBAUDRATE,并验证响应是否正常=确认 6开放式mySerialH 7清除串行通道 8关闭MySerial

从这一点到最后,使用MySerial发送消息

对我来说,它就像一个符咒-

再见