美文网首页
2018-03-27windows下的串口发送(c语言)

2018-03-27windows下的串口发送(c语言)

作者: 飞速遗忘 | 来源:发表于2018-03-27 16:23 被阅读0次

    第一步:打开串口

    打开串口使用的是CreateFile函数,
    原型:
    HANDLE CreateFile(
    LPCTSTR lpFileName, // 指向文件名的指针
    DWORD dwDesiredAccess, // 访问模式(写 / 读)
    DWORD dwShareMode, // 共享模式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
    DWORD dwCreationDisposition, // 如何创建
    DWORD dwFlagsAndAttributes, // 文件属性
    HANDLE hTemplateFile // 用于复制文件句柄,此例为NUll即可
    );
    CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。
    文件
    pipes
    邮槽
    通信资源
    磁盘驱动器(仅适用于 windowsNT )
    控制台
    文件夹(仅用于打开)

    失败时会返回INVALID_HANDLE_VALUE,成功则返回串口句柄。

    第二步:配置串口并让配置生效

    1.使用SetupComm(串口句柄, 输入缓冲区, 输出缓冲区) 该函数来设置缓冲区大小(单位字节)。
    2.设置超时。使用结构体COMMTIMEOUTS,
    typedef struct _COMMTIMEOUTS {
    DWORD ReadIntervalTimeout;
    DWORD ReadTotalTimeoutMultiplier;
    DWORD ReadTotalTimeoutConstant;
    DWORD WriteTotalTimeoutMultiplier;
    DWORD WriteTotalTimeoutConstant;
    } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
    参数解释:
    ReadIntervalTimeout:两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。设置为0表示该参数不起作用。 指定通讯线上两个字符到达的最大时延,以毫秒为单位。在ReadFile操作期间,时间周期从第一个字符接收到算起。如果收到的两个字符之间的间隔超过该值,ReadFile操作完毕并返回所有缓冲数据。如果ReadIntervalTimeout为0,则该值不起作用。

    如果值为MAXDWORD, 并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier两个值都为0, 则指定读操作携带已经收到的字符立即返回,即使没有收到任何字符。

    ReadTotalTimeoutMultiplier:读取每字符间的超时。 指定以毫秒为单位的累积值。用于计算读操作时的超时总数。对于每次读操作,该值与所要读的字节数相乘。

    ReadTotalTimeoutConstant:一次读取串口数据的固定超时。所以在一次读取串口的操作中,其超时为 ReadTotalTimeoutMultiplier乘以读取的字节数再加上 ReadTotalTimeoutConstant。将ReadIntervalTimeout设置为MAXDWORD,并将 ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant设置为0,表示读取操作将立即返回存放在输入缓冲区的字符。

    WriteTotalTimeoutMultiplier:写入每字符间的超时。

    WriteTotalTimeoutConstant:一次写入串口数据的固定超时。所以在一次写入串口的操作中,其超时为WriteTotalTimeoutMultiplier乘以写入的字节数再加上 WriteTotalTimeoutConstant。

    使用SetCommState(串口句柄,定义的超时结构体 )来使超时设置成效

    设置串口参数

    利用DCB结构体来配置
    常用的有:
    DCB dcb;
    dcb.BaudRate = 9600; //波特率9600
    dcb.ByteSize = 8; //8位数据位
    dcb.Parity = NOPARITY; //无校验位
    dcb.StopBits = ONE5STOPBITS;//1位停止位

    使用SetCommState(串口句柄,定义的串口结构体 )来使超时设置成效

    第三步 :发送或接收

    发送使用WriteFile函数

    BOOL WriteFile(
    HANDLE hFile,//文件的句柄
    LPCVOID lpBuffer,//用于保存读入数据的一个缓冲区
    DWORD nNumberOfBytesToWrite,//要读入的字符数
    LPDWORD lpNumberOfBytesWritten,//指向实际读取字节数的指针
    LPOVERLAPPED lpOverlapped//如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
    );

    接收使用ReadFile函数

    BOOL ReadFile(

    HANDLE hFile, //文件的句柄

    LPVOID lpBuffer, //用于保存读入数据的一个缓冲区

    DWORD nNumberOfBytesToRead, //要读入的字符数

    LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针

    LPOVERLAPPED lpOverlapped //同上

    );

    打完收工

    释放句柄CloseHandle(第一步时获取的句柄);

    蛇蛇的代码(瞎几把注释):https://github.com/ChenDuXiu/Serial-Port.git

    相关文章

      网友评论

          本文标题:2018-03-27windows下的串口发送(c语言)

          本文链接:https://www.haomeiwen.com/subject/shlscftx.html