如何将termios字节映射到struct?

时间:2017-12-24 08:58:53

标签: c# serial-port termios

我想将Libc函数tcgetattr返回的termios字节映射到C#中的类。

在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字节。它们之间的唯一区别是波特率B9600与使用Libc cfsetspeed设置的B38400(该平台是运行Raspbian Stretch的Raspberry PI):

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的字节和索引= 8的字节的位模式是有意义的,因为B9600 = 0xd且B38400 = 0xf。 189的最后一个字节是0xd,最后一个字节是191 os 0xf,所以看起来是正确的。但是,我不知道如何理解如何将字节映射到C结构。当速度改变时,c_ispeed和c_ospeed的字节是否已经改变?

任何人都可以解释如何将字节索引映射到C结构吗?

1 个答案:

答案 0 :(得分:-1)

请尝试以下代码。由于速度是第3个整数,所以字节的顺序看起来是错误的:

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);
            }

        }
    }
}