У меня проблема с датчиком FPS, подключенным через последовательный порт ttyAMA0. Его скорость по умолчанию при включении составляет 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;
}