精华内容
下载资源
问答
  • //打开串口2 // 在创建任何控件之前启用 Windows XP 可视化效果 Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // 创建主窗口并运行它 Application::Run(gcnew Form...

    新建windows应用程序commtest。

    commtest.cpp:

    // commtest.cpp: 主项目文件。

    #include "stdafx.h"

    #include "Form1.h"

    #include  //添加头文件

    #include

    using namespace commtest;

    bool openport(char *portname);

    [STAThreadAttribute]

    int main(array<:string> ^args)

    {

    bool open;

    open=openport("com2"); //打开串口2

    // 在创建任何控件之前启用 Windows XP 可视化效果

    Application::EnableVisualStyles();

    Application::SetCompatibleTextRenderingDefault(false);

    // 创建主窗口并运行它

    Application::Run(gcnew Form1());

    return 0;

    }

    bool openport(char *portname)//打开串口

    {

    HANDLE hComm;

    hComm = CreateFile(portname, //串口号

    GENERIC_READ | GENERIC_WRITE, //允许读写

    0, //通讯设备必须以独占方式打开

    0, //无安全属性

    OPEN_EXISTING, //通讯设备已存在

    FILE_FLAG_OVERLAPPED, //异步I/O

    0); //通讯设备不能用模板打开

    if (hComm == INVALID_HANDLE_VALUE)

    {

    CloseHandle(hComm);

    return FALSE;

    }

    else

    return true;

    }

    展开全文
  • 前言做串口方面的程序,使用CreateFile打开串口通信端口。在对串口操作之前,需要首先打开串口。使用C++进行串口编程,如果采用VS开发,则可以直接借助于串口通信控件来操作,其次,直接调用Windows的底层API函数来...

    通常使用下列函数来通过Win系统来对外围设备进行通信处理:

    0. 前言

    做串口方面的程序,使用CreateFile打开串口通信端口。在对串口操作之前,需要首先打开串口。使用C++进行串口编程,如果采用VS开发,则可以直接借助于串口通信控件来操作,其次,直接调用Windows的底层API函数来控制串口通信。

    在Window 32bit 的操作系统上, 将串口(通信设备)作为文件来处理,所以串口的打开、关闭、读写所使用的API函数与文件操作一样。所以打开串口使用CreateFile函数,读写串口使用ReadFile、WriteFile,函数。关闭串口使用CloseHandle函数。

    1. 查看通信串口设备,可以在设备管理器中查看;

    2.

    -------------------------------

    1. CreateFile

    这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。

    函数的声明定义:

    HANDLE WINAPI CreateFile(

    _In_ LPCTSTR lpFileName,

    _In_ DWORD dwDesiredAccess,

    _In_ DWORD dwShareMode,

    _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,

    _In_ DWORD dwCreationDisposition,

    _In_ DWORD dwFlagsAndAttributes,

    _In_opt_ HANDLE hTemplateFile

    );

    参数列表:

    286be2daeb84172cd190403f253c85f9.png

    部分参数Tips:

    1. lpFileName:指定要打开的串口逻辑名,用字符串来表示。如COM1, COM2,分别表示串口1,和串口2.

    如果要确定工控机上有那些串口,可以使用设备管理器查看。如下图:

    2ce3017ec9111d046764a8880c7edf15.png

    查看方式如下图:我的电脑,右键, 开发“设备管理器”即可。

    40d5bfde82e02f3ef2a1f86daebec7b7.png

    2. dwDesiredAccess:端口属性的访问类型,

    3.  dwShareMode:指定端口的共享属性。

    该参数是由那些应用程序共享的文件提供。对于串口来说,是不能共享的,因此,必须设置为0,这是通信设备与文件的特殊差别。

    如果当前的应用程序调用CreateFile打开一个串口,另外一个程序如果已经打开了该串口,此时CreateFile会返回一个错误代码。

    然而,同一个应用程序的多个线程是可以共享CreateFile返回的端口句柄。并且根据安全属性设置,该句柄可以打开端口的应用程序的子程序来继承。

    4. lpSecurityAttributes:安全属性,一般该参数为NULL,即该端口被设置为缺省的安全属性。缺省安全属性下,端口的句柄是不能继承的。

    5. dwCreationDisposition:指定此端口正在被其他程序占用采取的动作,因为串口总是存在的,因此必须设置为OPEN_EXISTing, 该标志高速Windows不要创建新的端口。而是打开一个已经存在的端口。

    ,  6. dwFlagsAndSttributes:描述了端口的各种属性,对于文件来说有很多属性,但是对于串口来说,唯一的意义是FILE_FLAG _OVERLAPPED 属性,当设置该属性时,端口IO可以在后台进行,称为异步IO重叠结构。

    7. hTemplateFile: 指定模板的文件句柄,对于串口来说,此参数必须设置为0;

    6d314d3b947c3342b0f47c3a352c8e56.png

    关闭串口

    关闭串口,使用CloseHandle,函数声明为:

    5bc587fb51d46f2ff2f91204a3cb36f8.png

    函数很简单,参数是使用CreateFile打开的端口句柄。调用这个函数可以实现串口关闭。

    示例如下:

    2376aec485f9ca427c43319fe8c020c3.png

    2. ReadFile

    从文件指针指向的位置(设备文件,通信)开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作。

    函数声明定义:

    BOOL WINAPI ReadFile(

    __in HANDLE hFile,//文件句柄

    __out LPVOID lpBuffer, //接收数据用的 buffer

    __in DWORD nNumberOfBytesToRead, //要读取的字节数

    __out LPDWORD lpNumberOfBytesRead, //实际读取到的字节数

    __in LPOVERLAPPED lpOverlapped //OVERLAPPED 结构,一般设定为 NULL

    );

    代码示例:、

    1 BOOL Read(char *filePath)2 {3 HANDLE pFile;4 DWORD fileSize;5 char *buffer,*tmpBuf;6 DWORD dwBytesRead,dwBytesToRead,tmpLen;7

    8 pFile =CreateFile(filePath,GENERIC_READ,9 FILE_SHARE_READ,10 NULL,11 OPEN_EXISTING, //打开已存在的文件

    12 FILE_ATTRIBUTE_NORMAL,13 NULL);14   // 创建设备文件,返回文件的位置

    15 if ( pFile ==INVALID_HANDLE_VALUE)16 {17 printf("open file error!");18 CloseHandle(pFile);19 returnFALSE;20 }21

    22 fileSize = GetFileSize(pFile,NULL); //得到文件的大小

    23

    24 buffer = (char *) malloc(fileSize);25 ZeroMemory(buffer,fileSize);26 dwBytesToRead =fileSize;27 dwBytesRead = 0;28 tmpBuf =buffer;29

    30 do{ //循环读文件,确保读出完整的文件

    31

    32 ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);33

    34 if (dwBytesRead == 0)35 break;36

    37 dwBytesToRead -=dwBytesRead;38 tmpBuf +=dwBytesRead;39

    40 } while (dwBytesToRead > 0);41

    42 //TODO 处理读到的数据 buffer

    43

    44 free(buffer);45 CloseHandle(pFile);46

    47 returnTRUE;48 }

    3. WriteFile

    将数据写入一个文件(设备文件,通信)。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE(非零)表示成功,否则返回零。会设置GetLastError。

    函数声明定义:

    BOOL WINAPI WriteFile(

    __in HANDLE hFile,//文件句柄

    __in LPCVOID lpBuffer, //要写入的数据

    __in DWORD nNumberOfBytesToWrite, //要写入的字节数

    __out LPDWORD lpNumberOfBytesWritten, //实际写入的字节数

    __in LPOVERLAPPED lpOverlapped //OVERLAPPED 结构,一般设定为 NULL

    );

    示例代码:

    1 BOOL Write(char *buffer, DWORD contentLen)2 {3 HANDLE pFile;4 char *tmpBuf;5 DWORD dwBytesWrite,dwBytesToWrite;6

    7 pFile =CreateFile(filePath,GENERIC_WRITE,8 0,9 NULL,10 CREATE_ALWAYS, //总是创建文件

    11 FILE_ATTRIBUTE_NORMAL,12 NULL);13

    14 if ( pFile ==INVALID_HANDLE_VALUE)15 {16 printf("create file error!");17 CloseHandle(pFile);18 returnFALSE;19 }20

    21 dwBytesToWrite =contentLen;22 dwBytesWrite = 0;23

    24 tmpBuf =buffer;25

    26 do{ //循环写文件,确保完整的文件被写入

    27

    28 WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);29

    30 dwBytesToWrite -=dwBytesWrite;31 tmpBuf +=dwBytesWrite;32

    33 } while (dwBytesToWrite > 0);34

    35 CloseHandle(pFile);36

    37 returnTRUE;38 }

    参考博客:

    打开Usb

    endl;

    展开全文
  • int comm_fd = -1; if(comm_fd !=-1) { close (comm_fd); comm_fd = -1; } char path[20] ={0}; strcpy(path,"/dev/ser1"); comm_fd = open ( path, O_RDWR,S_IRUSR | S_IWUSR)

    int comm_fd = -1;

    if(comm_fd !=-1)

    {

        close (comm_fd);

        comm_fd = -1;

    }

    char path[20] ={0};

    strcpy(path,"/dev/ser1");

    comm_fd = open ( path, O_RDWR,S_IRUSR | S_IWUSR)

    展开全文
  • 已结贴√问题点数:20回复次数:4 如何用程序关闭一个已经打开串口调用 C++ 的API 封装了一个串口函数 只能正常打开串口关闭串口想请教下如果串口已经打开,我如何在程序里判断,并把他关闭 ,然后在打开#include ...

    已结贴√

    问题点数:20 回复次数:4

    ca56232b3bbedf9a539d07f37fffb99a.gif

    3144d8b7615c79d9f638db40d5689d26.gif

    a218af6549b45ee526caf607ebff1358.gif

    0f8df0e29816ae721419de940fb833d1.gif

    如何用程序关闭一个已经打开的串口

    调用 C++ 的API 封装了一个串口函数 只能正常打开串口关闭串口

    想请教下如果串口已经被打开,我如何在程序里判断,并把他关闭 ,然后在打开

    #include "stdafx.h"

    #include "Uart.h"

    #include

    #include

    HANDLE UART_Open(int nPort, int nBuadRate)

    {

    char nt_port[10]={0};

    sprintf(nt_port,"COM%d",nPort);

    hCom = CreateFile(nt_port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

    //int ret = 0;

    if(hCom==(HANDLE)-1)

    {

    AfxMessageBox("打开COM失败!!");

    //TRACE("OPEN_PORT_FAIL\n");

    //  return OPEN_PORT_FAIL;

    }

    if(hCom == INVALID_HANDLE_VALUE)

    {

    AfxMessageBox("打开COM失败!!");

    //TRACE("OPEN_PORT_FAIL\n");

    // return OPEN_PORT_FAIL;

    }

    DCB dcb;

    if(!GetCommState(hCom,&dcb))    //获取COM口的设备控制块

    {

    CloseHandle(hCom);

    AfxMessageBox("获取串口参数失败!!");

    //    TRACE("GET_COM_STATA_FAIL\n");

    //  return GET_COM_STATA_FAIL;

    }

    dcb.BaudRate=nBuadRate;

    dcb.ByteSize=8;

    dcb.Parity=NOPARITY;

    dcb.StopBits=ONESTOPBIT;

    if(!SetCommState(hCom,&dcb))      //设置COM口的设备控制块

    {

    CloseHandle(hCom);

    AfxMessageBox("设置串口参数失败!!");

    //    TRACE("SET_COM_STATA_FAIL\n");

    //  return SET_COM_STATA_FAIL;

    }

    SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024

    COMMTIMEOUTS TimeOuts;

    //设定读超时

    TimeOuts.ReadIntervalTimeout=1000;

    TimeOuts.ReadTotalTimeoutMultiplier=300;

    TimeOuts.ReadTotalTimeoutConstant=2000;

    //设定写超时

    TimeOuts.WriteTotalTimeoutMultiplier=300;

    TimeOuts.WriteTotalTimeoutConstant=2000;

    if(!SetCommTimeouts(hCom,&TimeOuts)) //将超时参数写入设备控制

    {

    CloseHandle(hCom);

    AfxMessageBox("设置串口超时失败!!");

    //  TRACE("SET_COM_TIMEOUT_FAIL\n");

    //   return SET_COM_TIMEOUT_FAIL;

    }

    PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区

    return hCom;

    }

    int  UART_Read(HANDLE hCom, char *buf, int buf_len)

    {

    int  ret = 0;

    DWORD len;

    ret = ReadFile(hCom,buf,buf_len,&len,NULL);

    if(!ret)

    {

    //TRACE("RECV_DATA_FAIL\n");

    AfxMessageBox("读取数据失败!!");

    return RECV_DATA_FAIL;

    }

    if(len == 0)

    {

    //    TRACE("RECV_DATA_TIMEOUT\n");

    AfxMessageBox("读取数据超时!!");

    return RECV_DATA_TIMEOUT;

    }

    return  0;

    }

    int UART_Write(HANDLE hCom, char *buf, int buf_len)

    {

    int  ret = 0;

    DWORD len;

    //    ClearCommError(hCom,&dErrorflag,&comstat);

    ret = WriteFile(hCom,buf,buf_len,&len,NULL);

    if(!ret)

    {

    //TRACE("SEND_DATA_FAIL\n");

    AfxMessageBox("写入数据失败!!");

    return SEND_DATA_FAIL;

    }

    if(len==0)

    {

    //TRACE("SEND_DATA_TIMEOUT\n");

    AfxMessageBox("写入数据超时!!");

    return SEND_DATA_TIMEOUT;

    }

    PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区

    return 0;

    }

    int UART_Close(HANDLE hCom)

    {

    int ret=0;

    ret=CloseHandle(hCom);

    if(!ret)

    {

    // TRACE("CLOSE_PORT_FAIL\n");

    AfxMessageBox("关闭串口失败!!");

    return CLOSE_PORT_FAIL ;

    }

    return 0;

    }

    搜索更多相关主题的帖子:

    如何 include

    展开全文
  • MATLAB经常用于和单片机的串口进行通信,简单记录下MATLAB串口打开和关闭。MATLAB版本为比较新的2021a,使用serialport函数进行打开操作,关闭则用delete。 % 定义串口参数 serialComName = 'COM38'; ...
  • 参考文章:http://blog.csdn.net/rl529014/article/details/51336161http://blog.csdn.net/lin_fs/article/details/7804494http://blog.csdn.net/querdaizhi/article/details/7478169以flock函数打开设备文件打开,是...
  • 错误:串口打开失败!请检查指定串口是否存在或者已被打开 1、检查COM口是否冲突 解决方法: 将冲突COM口改为其他COM口号 步骤: 一、打开此电脑,点击管理 二、打开计算机管理后,打开设备管理器。 三、右键...
  • C# 扫描和打开串口

    2021-10-09 17:44:58
    C# 扫描和打开串口 引言 关于C#Form窗口框架下使用串口通信中扫描串口打开串口操作是最基础最重要的步骤。在这里我用一个demo小程序以最简单的方式实现,小结一下。 一、建工程界面 1、新建C# window窗体 (.net...
  • android中打开串口打印

    2021-06-04 06:04:35
    user版本打开uart如何在user版本中使用串口(uart)bootable/bootloader/lk/app/mt_boot/mt_boot.c 1234512345582 #ifdef USER_BUILD583 sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=1");584 #else585 sp.....
  • Qt中的串口使用QSerialPort,QSerialPortInfo两个类,而这两个类的使用必须在工程文件中加入 serialport模块,也就是串口模块。 QT += serialport 包含头文件 两个类的作用 QSerialPort类:提供访问串口的功能。...
  • int open_port(int fd,int comport){char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/...if(comport==0){//串口0fd=open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);if(-1==fd){perror("Can't Open Serial P...
  • 连接OTG,用adb命令 adb root //获取root权限,出现restarting adbd as root表示有root权限 adb shell cd dev chmod 777 tty* (可以指定具体的串口号,tty*是把所有的tty开头的文件权限全部设置为可读可写)
  • 使用fedora 11, 在连续课程中: /* \return 1 success \return -1 device not found \return -2 error ... 和Ret值是-2,这意味着如上所述打开设备时出错可能是一个权限问题?我怎么能解决这个问题并打开端口,谢谢!
  • 打开CCS自带的串口

    2021-01-15 20:29:23
    按照图片一步步来 会打开这样一个窗口 点击这个图标 配置你需要就行了 显示效果
  • 无法在Linux打开串口

    2021-05-14 00:18:45
    使用的Fedora 11,无法在Linux打开串口串行类:/*\return 1 success\return -1 device not found\return -2 error while opening the device\return -3 error while getting port parameters\return -4 Speed ...
  • qt 打开串口 UI卡死

    2020-12-30 22:51:50
    调试串口已经被文件系统占用,而在qt的app中使用open函数却能够调用open函数,打开成功,造成ui卡死,并且调试串口也卡死。本文记录这个问题的解决方法。try {//查找/etc/inittab文件中,是否使用ttymxc0作为调试...
  • 串口 若何 打开 通信 android android 串口通讯 androidusb转串口通讯 android 蓝牙串口通讯 android串口通讯demo ble串口通讯 android android 打开通讯录 android打开串口 android 打开串口失败 android如何打开...
  • 即使没有打开,Linux终端驱动程序也会缓冲输入.这可能是一个有用的功能,特别是如果速度/奇偶校验/等.设置得当.要复制较小操作系统的行为,请在打开时立即从端口读取所有挂起的输入:...int fd = open ("/dev/ttyS0", O...
  • 问题1:串口打开失败
  • 但是普通用户没有usb操作权限(函数open()打不开串口:refused),如果我们想在ROS程序里面打开串口,就得首先放开串口权限。 法一: 为了使普通用户也能正常使用USB转串口设备, 可以通过增加udev规则来实现: 创建文件...
  • 一般来说user版本是关闭串口log的,如果特需情况下要开启user版本的串口log,可以按照以下步骤: 1.开启lk阶段的log vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c @@ -1167,7 +...
  • 这个简单的程序包括以下文件:IMU.java (主程序)ReadBuffer.java(从缓冲区读取一个消息)ReadSerial.java (读取串口数据并放入缓冲区)SerialBuffer.java(缓冲区)WriteSerial.java (不断的往串口送星号´*´)测试程序...
  • 现在需要将串口打开,进行调试 1、修改dtsi kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi fiq_debugger: fiq-debugger { compatible = "rockchip,fiq-debugger"; rockchip,serial-id = <2&...
  • 例如按照你图里的命令,可以采用这种方法来注册 DLL: 1、打开开始菜单,输入cmd,在搜索出的CMD上右键,选择以管理员身份运行 2、在打开的命令提示符里输入:cd \windows\syswow64 这个命令是将目录设置到syswow64...
  • 高通8953 Android 9.0 打开user调试串口 文章目录高通8953 Android 9.0 打开user调试串口1、user模式打开kernel log调试2、另外需要修改user版本串口只有输出不能输入的问题 内核版本 Linux4.9 平台 高通...
  • 打开串口在前面已经提到linux下的串口访问是以设备文件形式进行的,所以打开串口也即是打开文件的操作。函数原型可以如下所示:int open(“DE_name”,intopen_Status)参数说明:(1)DE_name:要打开的设备文件名比如...
  • 为了打开 /dev/下的串口设备,并进行收发数据的操作 2:用到内容 文件操作 定时器timerfd 监听函数 select 3:示例 /************************************************************************* > File Name...
  • 在照网上教程正常打开CuteCom后,许多人会遇到Could not open /dev/ttyUSB*,这是因为 ttyUSB的读写权限不够, 更改权限即可,即在终端中输入sudo chmod 666 /dev/ttyUSB。这个语句的意义可参考...
  • Cutecom无法打开USB串口

    2021-01-19 11:33:54
    Cutecom无法打开USB串口 sudo chmod 666 /dev/ttyUSB0 修改后可正常打开串口
  • 1、USBD_CDC_Init(usbd_cdc.c文件)中找到USBD_malloc调用的地方,改成静态分配; 如下图: 屏蔽掉红框内容,添加绿框内容 2、USBD_CDC_DeInit中注释掉USBD_free函数的调用; 屏蔽掉红框内容

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,381
精华内容 51,752
关键字:

串口已经打开