2017-12-20 32 views
3

Ich habe folgende .NET Core 2.0 C# -Code:Wie stelle ich die Baudrate am seriellen Port des Raspberry PI ein?

using System; 
using System.Runtime.InteropServices; 

namespace TestSerial 
{ 
    class Program 
    { 
     [Flags] 
     public enum OpenFlags 
     { 
      O_RDONLY = 0, 
      O_WRONLY = 1, 
      O_RDWR = 2, 

      O_NONBLOCK = 4, 
     } 

     [DllImport("libc")] 
     public static extern int cfsetspeed(byte[] termios_data, long speed); 

     [DllImport("libc")] 
     public static extern int tcgetattr(int fd, [Out] byte[] termios_data); 

     [DllImport("libc")] 
     public static extern int tcsetattr(int fd, int optional_actions, byte[] termios_data); 

     [DllImport("libc")] 
     public static extern int open(string pathname, OpenFlags flags); 


     static void Main(string[] args) 
     { 
      const string serialDevice = "/dev/serial/by-id/usb-ELT_SENSOR_EK100_V1.0_SN000001-if00-port0"; 

      int fileDescriptor = open(serialDevice, OpenFlags.O_RDONLY | OpenFlags.O_NONBLOCK); 
      Console.WriteLine($"Libc.open returned {fileDescriptor}"); 

      byte[] termiosData = new byte[256]; 

      int result = tcgetattr(fileDescriptor, termiosData); 
      Console.WriteLine($"Libc.tcgetattr returned {result}"); 

      result = cfsetspeed(termiosData, 38400); 
      Console.WriteLine($"Libc.cfsetspeed returned {result}"); 

      result = tcsetattr(fileDescriptor, 0, termiosData); 
      Console.WriteLine($"Libc.tcsetattr returned {result}"); 
     } 
    } 
} 

Das Programm sollte die Baudrate einer seriellen USB-Port 38400. ändern Aber wird das Programm nicht wie erwartet funktionieren.

Dies ist die Ausgabe von der Ausführung des Programms:

Libc.open returned 18 
Libc.tcgetattr returned 0 
Libc.cfsetspeed returned -1 
Libc.tcsetattr returned 0 

Ich habe Doppel auch die Einstellungen der seriellen Schnittstelle überprüft und es ist in der Tat unverändert:

$ sudo stty -a -F /dev/serial/by-id/usb-ELT_SENSOR_EK100_V1.0_SN000001-if00-port0 
speed 9600 baud; rows 0; columns 0; line = 0; 
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; 
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; 
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts 
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff 
-iuclc -ixany -imaxbel -iutf8 
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt 
echoctl echoke -flusho -extproc 

Was Grund für den Fehler sein könnte zurück von Libc.cfsetspeed?

Antwort

0

Das Problem war ein falscher Datentyp (lang) in der Deklaration des Geschwindigkeitsparameters für die Funktion cfsetspeed. Der Datentyp für den Parameter Geschwindigkeit sollte Uint sein.

Dies ist der richtige Code:

using System; 
using System.Runtime.InteropServices; 

namespace TestSerial 
{ 
    class Program 
    { 
     [Flags] 
     public enum OpenFlags 
     { 
      O_RDONLY = 0, 
      O_WRONLY = 1, 
      O_RDWR = 2, 

      O_NONBLOCK = 4, 
     } 

     [DllImport("libc")] 
     public static extern int cfsetspeed(byte[] termios_data, uint speed); 

     [DllImport("libc")] 
     public static extern int tcgetattr(int fd, [Out] byte[] termios_data); 

     [DllImport("libc")] 
     public static extern int tcsetattr(int fd, int optional_actions, byte[] termios_data); 

     [DllImport("libc")] 
     public static extern int open(string pathname, OpenFlags flags); 


     static void Main(string[] args) 
     { 
      const string serialDevice = "/dev/serial/by-id/usb-ELT_SENSOR_EK100_V1.0_SN000001-if00-port0"; 

      int fileDescriptor = open(serialDevice, OpenFlags.O_RDONLY | OpenFlags.O_NONBLOCK); 
      Console.WriteLine($"Libc.open returned {fileDescriptor}"); 

      byte[] termiosData = new byte[256]; 

      int result = tcgetattr(fileDescriptor, termiosData); 
      Console.WriteLine($"Libc.tcgetattr returned {result}"); 

      result = cfsetspeed(termiosData, 38400); 
      Console.WriteLine($"Libc.cfsetspeed returned {result}"); 

      result = tcsetattr(fileDescriptor, 0, termiosData); 
      Console.WriteLine($"Libc.tcsetattr returned {result}"); 
     } 
    } 
} 
Verwandte Themen