inb和outb命令的波特率 - linux

时间:2017-11-01 05:24:40

标签: linux serial-port baud-rate

我想通过计算机中的真实串口将二进制数据从我的PC传递到我的微控制器。在这个时候,我正在考虑使用INB和OUTB函数,所以我不必忍受linux tty字符覆盖。

问题是,如果我将其地址与INB和OUTB功能一起使用,如何配置串口的波特率?例如,如果我想写入COM1(0x3F8),我将如何确定正在写入的波特率数据?

stty是否仍然使用INB和OUTB或setserial或者什么来进行某种背景控制?

2 个答案:

答案 0 :(得分:1)

  

目前,我正在考虑使用INB和OUTB功能,因此我不必忍受linux tty字符覆盖。

这是一个可怕的,没有好的,非常坏的想法,它不会起作用。如果您尝试从其下更改端口配置,现有的串行驱动程序将会非常混乱。

Use standard UNIX APIs to interact with the serial port.这并不难。

答案 1 :(得分:0)

当然,Duskwuff是对的。为什么要进入低级而不使用API​​?

参见http://www.tldp.org/HOWTO/text/IO-Port-Programming第6.3节:

  

如果您正在与之通话的设备支持类似RS-232的设备,   你应该能够使用串口与它通信。 Linux   串行驱动程序应该足以满足几乎所有应用程序(你   不应该直接编程串口,你可能   必须写一个内核驱动程序来做到这一点);它非常通用,所以   使用非标准的bps率等等应该不是问题。

为了说明这一点,这里是原始问题“如何设置波特率”的答案:

除了端口(例如COM1的0x3F8)之外,接下来的几个端口号用于各种控制目的。要设置波特率,首先计算除数115200 / [所需波特率]。例如。如果你想要38400波特,则除数为3.然后:

  • 设置PORT + 3的最高位
  • 将除数的最低有效字节发送到PORT
  • 将除数的最高有效字节发送到PORT + 1
  • 清除PORT + 3的最高位(同时,低位可用于设置奇偶校验,停止位等。)

在代码中:

   outb(PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
   outb(PORT + 0, 0x03);    // Set divisor to 3 (lo byte) 38400 baud
   outb(PORT + 1, 0x00);    //                  (hi byte)
   outb(PORT + 3, 0x03);    // 8 bits, no parity, one stop bit

来源在这里:http://wiki.osdev.org/Serial_Ports