我想将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结构吗?
答案 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);
}
}
}
}