2017-12-24 6 views
0

Libc 함수 tcgetattr에서 반환 한 termios 바이트를 C#의 클래스에 매핑하려고합니다.termios 바이트를 구조체에 매핑하는 방법은 무엇입니까?

다음
#define NCCS 12 

typedef unsigned cc_t; 
typedef unsigned speed_t; 
typedef unsigned tcflag_t; 

struct termios { 
    cc_t  c_cc[NCCS]; 
    tcflag_t c_cflag; 
    tcflag_t c_iflag; 
    tcflag_t c_lflag; 
    tcflag_t c_oflag; 
    speed_t c_ispeed; 
    speed_t c_ospeed; 
}; 

직렬 포트의 termios의 바이트이다 C에서의 termios의

같이 정의된다. 이들 사이의 유일한 차이점의 libc cfsetspeed는 함께 B38400 세트 (플랫폼 라즈베리 PI가 Raspbian 스트레치를 실행) 대 보레이트 B9600이다

Byte# B38400 B9600 
0  0 0 
1  5 5 
2  0 0 
3  0 0 
4  5 5 
5  0 0 
6  0 0 
7  0 0 
8  191 189 
9  12 12 
10  0 0 
11  0 0 
12  59 59 
13  138 138 
14  0 0 
15  0 0 
16  0 0 
17  3 3 
18  28 28 
19  127 127 
20  21 21 
21  4 4 
22  0 0 
23  0 1 
24  0 0 
25  17 17 
26  19 19 
27  26 26 
28  0 0 
29  18 18 
30  15 15 
31  23 23 
32  22 22 

B9600 및 B38400의 유일한 차이점은 인덱스와 바이트 = 8 B9600 = 0xd 및 B38400 = 0xf이므로, 인덱스 = 8 인 바이트에 대한 비트 패턴은 의미가있다. 189의 마지막 바이트는 0xd이고 191의 마지막 바이트는 0xf이므로 올바르게 표시됩니다. 하지만, 어떻게 정확하게 구조체에 바이트를 매핑하는 방법을 이해하는 방법을 모르겠어요. 속도가 변경되면 c_ispeed 및 c_ospeed의 바이트가 변경되지 않아야합니다.

누구든지 C 구조체에 바이트 인덱스를 매핑하는 방법을 설명 할 수 있습니까?

답변

-1

아래 코드를 사용해보십시오. 속도가 세 번째 정수이기 때문에 바이트 순서가 잘못되었습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public struct Termios { 

      public uint c_cc1 { get; set; } 
      public uint c_cc2 { get; set; } 
      public uint c_cflag { get; set; } 
      public uint c_iflag { get; set; } 
      public uint c_lflag { get; set; } 
      public uint c_oflag { get; set; } 
      public uint c_ispeed { get; set; } 
      public uint c_ospeed { get; set; } 
     }; 
     static void Main(string[] args) 
     { 
      //Byte# B38400 B9600 
      byte[,] input = { 
           {0,5, 0,0,5,0,0,0,191, 12,0,0,59,138, 0,0,0,3,127,21,4,0,0,0,17,19,26,0,18,15, 23,22}, 
           {0,5, 0,0,5,0,0,0,189, 12,0,0,59,138, 0,0,0,3,127,21,4,0,1,0,17,19,26,0,18,15, 23,22} 
          }; 

      Termios[] termios = new Termios[2]; 

      for(int i = 0; i < 2; i++) 
      { 
       termios[i].c_cc1 = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(),0); 
       termios[i].c_cc2 = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 4); 
       termios[i].c_cflag = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 8); 
       termios[i].c_iflag = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 12); 
       termios[i].c_lflag = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 16); 
       termios[i].c_oflag = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 20); 
       termios[i].c_ispeed = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 24); 
       termios[i].c_ospeed = BitConverter.ToUInt32(input.Cast<byte>().Skip(i * 32).ToArray(), 28); 
      } 

     } 
    } 
}