📜  输入输出端口(1)

📅  最后修改于: 2023-12-03 15:28:17.764000             🧑  作者: Mango

输入输出端口

简介

在计算机中,输入输出端口(Input/Output Port)是用于外部设备与计算机进行通信的接口。这些端口与计算机的处理器相连,可以在计算机和外部设备之间传输数据。

硬件端口

计算机的硬件端口是指物理接口,通常在计算机主板上,用于与外部设备进行通信。硬件端口通常包括以下几种类型:

  • 串行端口:用于传输一个比特位的数据,例如 RS-232。
  • 并行端口:可以同时传输多个比特位的数据,例如 IEEE 1284。
  • USB 端口:用于接连各种 USB 外设,例如键盘、鼠标、打印机、扫描仪等等。
  • 以太网端口:用于网络连接,例如 RJ45。
  • 音频接口:用于连接音频设备,例如耳机、扬声器等。
软件端口

在计算机中,软件端口是指通过软件提供的 API (Application Programming Interface,应用程序编程接口)接口访问外部设备的接口。软件端口通常分为以下两类:

1. 文件型端口

文件型端口会将一个设备模拟为一个文件,程序员可以像读取、写入文件一样读取、写入数据到这个“文件”。例如在 Unix 系统下,一个串口设备可以被模拟为一个文件,程序员可以通过打开 Serial Port 设备对应的文件,使用 read 和 write 系统调用读取或写入数据。

2. 底层端口

底层端口则是直接操作硬件端口。底层端口的应用场景较为特殊,例如在需要直接操作某个设备驱动程序的情况下。

代码片段
1. 读写文件型端口(Python)
import serial

# 打开串口
ser = serial.Serial('/dev/ttyUSB0', 9600)

# 发送数据
ser.write(b'hello!')

# 接收数据
resp = ser.read(10)
print(resp)

这里以 Python 的 PySerial 库为例,通过打开串口设备对应的文件,就可以像读写文件一样读写串口设备。

2. 读写底层端口(C++)
#include <Windows.h>
#include <iostream>

int main()
{
    // 打开端口
    HANDLE hCom = ::CreateFile(TEXT("COM1"), GENERIC_READ | GENERIC_WRITE, 0, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hCom == INVALID_HANDLE_VALUE) {
        std::cout << "Failed to open serial port!" << std::endl;
        return -1;
    }

    // 配置端口参数,波特率=9600
    DCB dcb{};
    ::GetCommState(hCom, &dcb);
    dcb.BaudRate = 9600;
    ::SetCommState(hCom, &dcb);

    // 发送数据
    char data[] = "Hello!";
    DWORD bytesWritten = 0;
    ::WriteFile(hCom, data, strlen(data), &bytesWritten, NULL);

    // 接收数据
    char buf[100];
    DWORD bytesRead = 0;
    ::ReadFile(hCom, buf, sizeof(buf), &bytesRead, NULL);
    std::cout << buf;

    // 关闭端口
    ::CloseHandle(hCom);

    return 0;
}

这里以 Windows 操作系统为例,利用 Windows API 直接操作端口,读写数据。