c语言打开串口

C语言编程:如何同时打开多个串口进行通信?

可以两个方式:

1、如果是 MSComm控件方式可以加入三个控件分别控制;在OnComm事件里面接收数据;用m_Comm.SetOutput(COleVariant(m_SendData));发送数据;

2、把 MSComm控件 打包在一个类里面,自己写初始化和发送接收函数;

c语言打开串口

如何利用C语言,C++语言打开USB串口,然後对其发送信号? 跪求回答! 可行比加分!!

openfile和createfile,就可以,可以打开串口号的,创建接收信息,发送。。。

c语言串口通讯过程?

分接收端和发送端。

接收端:

1·打开com1端口

fd=fopen(“/dev/ttys0”,方式);

2·取得当前串口值,保存到结构体变量oldtio

tcgetattr(fd,oldtio);

3·串口结构体变量newtio清0.

bzero(newtio,sizeof(newtio))

4·设置串口参数

主要设置比特率、是否忽略奇偶校验错误,启用正规模式等等。

接收端

1·打开com端口

2·取得当前串口值

3·串口结构体变量清0

4·设置串口参数。

如何用C语言控制计算机串口

基本方法是使用CreateFile来建立一个串口文件,然后用overlap的方式进行读写

#define SERAIL_PORT_BUF_MAX (1024*8)

typedef HRESULT (*PFN_CMD_PARSE_DATA)(HANDLE hParseApp, LPCSTR szRspCmd, int nCmdLen);

class CUsbSrvApp// : public CWinApp

{

public:

CUsbSrvApp();

~CUsbSrvApp();

BOOL OnSendData(const char *szBuf, int nLen);// 发送数据

int ComConnect(CString strPort); // 连接COM口

HANDLE OpenComPort(CString strPort, int nBaudRate, int nDataBits, int nStopBits, int nParity, int nFlowCtrlType); // 打开串口

void Close(); // 关闭串口

HANDLE m_hCom;

BOOL m_bConnected;

OVERLAPPED m_OverlappedRead;

OVERLAPPED m_OverlappedWrite;

CWinThread *m_pThread;

PFN_CMD_PARSE_DATA m_pRspCmdFunc; // 用来处理接受数据的CALLBACK

HANDLE m_hParseApp;

};

CUsbSrvApp::CUsbSrvApp()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

m_bConnected = false;

m_hCom = NULL;

m_pRspCmdFunc = NULL;

}

CUsbSrvApp::~CUsbSrvApp()

{

}

//打开串口通信,并返回串口句柄

HANDLE CUsbSrvApp::OpenComPort(CString strPortName,

int nBaudRate,

int nDataBits,

int nStopBits,

int nParity,

int nFlowCtrlType)

{

DCB dcb;

COMMTIMEOUTS CommTimeOuts ;

COMMCONFIG ComConfig;

HANDLE hComPort;

CString strPort;

strPort.Format(“\\\\.\\%s”,strPortName); // COM口的文件名应该是 \\.\COMXX

//打开窗口其实就是创建一个文件

hComPort = CreateFile(strPort,

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,

NULL);

if (INVALID_HANDLE_VALUE == hComPort)

return INVALID_HANDLE_VALUE;

// 设置一些COM口通讯参数和OVERLAP

CommTimeOuts.ReadIntervalTimeout = -1;

CommTimeOuts.ReadTotalTimeoutConstant = 0;

CommTimeOuts.ReadTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 0;

CommTimeOuts.WriteTotalTimeoutMultiplier = 0x1388;

SetCommTimeouts( m_hCom, CommTimeOuts ) ;

SetDefaultCommConfig(strPortName, ComConfig, sizeof(COMMCONFIG));

GetCommState(m_hCom, dcb ) ;

dcb.BaudRate = nBaudRate;

dcb.ByteSize = nDataBits;

dcb.StopBits = nStopBits;

dcb.fParity = (NOPARITY != nParity);

dcb.Parity = nParity;

//set the receive char

dcb.EvtChar = 0x0D;

switch(nFlowCtrlType)

{

case 0: //no flow control

break;

case 1://HARD_FLOW_CTRL:

dcb.fOutxCtsFlow = TRUE;

dcb.fOutxDsrFlow = TRUE;

dcb.fDtrControl = DTR_CONTROL_DISABLE;

dcb.fDsrSensitivity = TRUE;

dcb.fRtsControl = RTS_CONTROL_TOGGLE;

break;

case 2://SOFT_FLOW_CTRL:

dcb.fOutX = TRUE;

dcb.fInX = TRUE;

break;

}

BuildCommDCB(_T(“baud=115200 parity=N data=8 stop=1”),dcb);

SetCommState(hComPort, dcb ) ;

SetCommMask(hComPort, 0);

SetCommMask(hComPort, EV_RXCHAR|EV_CTS|EV_DSR|EV_RLSD|EV_RING);

SetupComm( hComPort, SERAIL_PORT_BUF_MAX,SERAIL_PORT_BUF_MAX) ;

//clear read and write buffer

PurgeComm( hComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

return hComPort;

}

void CUsbSrvApp::Close()

{

if(m_bConnected)

{

m_bConnected = false;

CloseHandle(m_hCom);

m_hCom = NULL;

}

}

// 这个线程是监视串口数据,一旦有数据则读取并调用CALLBACK通知客户端

UINT ReceiveComData(LPVOID pParam)

{

CUsbSrvApp *pUsbSrv = (CUsbSrvApp *)pParam;

HANDLE hComPort = pUsbSrv-m_hCom;

DWORD dwEvtMask=0;

DWORD dwErrorFlags;

SetCommMask( hComPort, EV_RXCHAR);

OVERLAPPED osRead;

osRead.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

DWORD dwTransfer = 0;

while(pUsbSrv-m_bConnected)

{

if( !WaitCommEvent( hComPort, dwEvtMask,osRead))

{

if( GetLastError()== ERROR_IO_PENDING)

{

WaitForSingleObject(osRead.hEvent, INFINITE);

if(dwEvtMaskEV_RXCHAR==EV_RXCHAR)

{

COMSTAT ComStat={0} ;

DWORD dwReadLen = 0;

DWORD dwBytesRead = 0;

DWORD dwTotalLen = 0;

ClearCommError(hComPort, dwErrorFlags, ComStat );

dwTotalLen = ComStat.cbInQue;

dwReadLen = (SERAIL_PORT_BUF_MAX dwTotalLen)?dwTotalLen:SERAIL_PORT_BUF_MAX;

BYTE *pBuf = new BYTE[dwTotalLen+1];

memset(pBuf, 0 , dwTotalLen+1);

DWORD nReadBufLen=0;

while(dwTotalLen0)

{

if(FALSE == ReadFile( hComPort, pBuf+nReadBufLen,dwReadLen, dwBytesRead,pUsbSrv-m_OverlappedRead))

{

if(GetLastError() == ERROR_IO_PENDING)

{

GetOverlappedResult(hComPort,osRead, dwTransfer, TRUE );

}

break;

}

nReadBufLen +=dwBytesRead;

dwTotalLen -=dwBytesRead;

dwReadLen -= dwBytesRead;

dwReadLen = (SERAIL_PORT_BUF_MAXdwReadLen)?dwReadLen:SERAIL_PORT_BUF_MAX;

}

if(pUsbSrv-m_pRspCmdFunc!=NULLnReadBufLen!=0)

{

pUsbSrv-m_pRspCmdFunc(pUsbSrv-m_hParseApp, (char*)pBuf,nReadBufLen);

}

delete pBuf;

ClearCommError(hComPort, dwErrorFlags, ComStat );

int len =0;//= m_retList.GetSize();

}//endif if(dwEvtMaskEV_RXCHAR==EV_RXCHAR)

}//endif if( GetLastError()== ERROR_IO_PENDING)

}//endif if( !WaitCommEvent( hComPort, dwEvtMask,o))

else

{

if(GetLastError() == ERROR_IO_PENDING) {

GetOverlappedResult(hComPort, osRead, dwTransfer, TRUE ); // sleep thread

}

}

Sleep(1);

} //endwhile while(m_bConnected)

return 0;

}

int CUsbSrvApp::ComConnect(CString strPort)

{

int nBaudRate = 115200;

int nDataBits = 8;

int nStopBits = 1;

int nParity = 0;

int nFlowCtrl = 1;

if (NULL != m_hCom || m_bConnected)

{

return 0;

}

m_hCom = OpenComPort(strPort,nBaudRate,nDataBits,nStopBits,nParity,nFlowCtrl);

if( INVALID_HANDLE_VALUE == m_hCom)

{

m_hCom = NULL;

return 0;

}

memset( m_OverlappedRead, 0, sizeof( OVERLAPPED ) );

memset( m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

m_pThread = AfxBeginThread( ReceiveComData,(void*)this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED ,NULL );

if( NULL == m_pThread )

{

CloseHandle( m_hCom );

m_hCom = NULL;

return FALSE;

}

else

{

m_bConnected = TRUE;

m_pThread-ResumeThread( );

}

return TRUE;

}

int CUsbSrvApp::OnSendData(const char *szBuf, int nLen)

{

BOOL bWriteStat;

BOOL bWrite = TRUE;

DWORD dwBytesWrite = 0;

DWORD dwBytesWritten = 0;

int dwByteswrittenTotal = 0;

if (NULL == m_hCom)

return 0;

int nSentTimes=0;

while(dwByteswrittenTotalnLennSentTimes10)

{

nSentTimes++;

dwBytesWrite = nLen-dwByteswrittenTotal;

bWriteStat = WriteFile( m_hCom, szBuf+dwByteswrittenTotal, dwBytesWrite, dwBytesWritten, m_OverlappedWrite );

if( !bWriteStat)

{

if ( GetLastError() == ERROR_IO_PENDING )

{

dwBytesWritten = 0;

bWrite = FALSE;

}

}

if (!bWrite)

{

bWrite = TRUE;

bWriteStat = GetOverlappedResult(m_hCom, // Handle to COMM port

m_OverlappedWrite, // Overlapped structure

dwBytesWritten, // Stores number of bytes sent

TRUE); // Wait flag

//deal with the error code

}

dwByteswrittenTotal += dwBytesWritten;

}

if(dwByteswrittenTotalnLen)

return 0;

else

return 1;

}

C语言打开串口报错。

你申请的char字段comname 存文件名肯定有问题哦,我给你修改了一下,可以运行通过了。

    FILE *usart;

    int i = 10;

    char comname[100];

    printf(“请输入串口号:”);

    scanf(“%s”, comname);

    if ((usart = fopen(comname, “r”)) == NULL)

        printf(“无法连接%s \n”, comname);

    else

        printf(“串口连接成功!\n”);

    fclose(usart);

    return 0;

C语言中如何对串口进行操作

C语言会有操作串口的库函数的,按照串口库函数标识实现调用就可以了。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 12:11:43
下一篇 2024年3月27日 12:22:01

相关推荐

  • c语言对比两个数组,两个数组怎么样一一对应c语

    C语言数组比对 C语言中字符是使用char来定义的,使用关系运算符(,=)即可对字符进行比较。在编译器中定义a、b两个字符型变量,并为其赋值,按照如图所示编写代码。运行代码后,我们可以得到如图所示结果。 C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。 首先打开CodeBlocks。创建一个新项目。项目语言,选择“c”。我们将项目名称命名…

    2024年5月12日
    3800
  • 如何用c语言编写卷积,卷积码c语言

    C语言用子函数实现卷积 1、conv(x, h, sizeof(x) / sizeof(x[0]), sizeof(h) / sizeof(h[0]), result); 就是实现这个目标的。 2、C语言函数是一种函数,用来编译C语言,一般包括字符库函数,数学函数,目录函数,进程函数,诊断函数,操作函数等。本质是将一个语句块通过命名的方式独立出来,通过调用函…

    2024年5月12日
    3700
  • c语言iostream头文件,c语言头文件stdioh

    iostream头文件的作用 1、iostream头文件的作用iostream头文件作用是让初学者有一个方便的命令行输入输出试验环境,iostream的设计初衷是提供一个可扩展的类型安全的IO机制。iostream头文件包含了操作输入输出流的方法,比如以流的方式读取一个文件。 2、这个文件的作用是让初学者有一个方便的命令行输入输出试验环境。 3、引入iost…

    2024年5月12日
    3300
  • 链表删除c语言,c语言用链表删除函数怎么写

    c语言实现线性链表中删除一个大于某数的元素 int num;//要删除的数字 node *head=new node;do { cout依次输入个数n(1=n=200000),n个元素(用空格分隔),待删除的元素。 你调用 的delmaxnode(L)是处理非循环链表的。 求C语言 数据结构中的链表创建,插入和删除代码 急求一段能运行,能编译(没一点错误,不…

    2024年5月12日
    3600
  • c语言传入命令行参数,c语言命令行参数如何运行

    c语言如何传送参数 在主函数中,先定义一个变量,然后输入一个值,在a()这个函数中输出。当程序运行a(num); 这一步时,把num的值赋值给num_back,在运行程序过程中,把实际参数的值传给形式参 数,这就是函数参数的传递。 建立中间变量(形参),把实参值赋值给中间变量,当被调函数返回值时,系统释放掉中间变量。在程序中通过对函数的调用来执行函数体,其过…

    2024年5月12日
    3600
  • c语言ab=c编程,c语言 abi

    C语言程序中a=b==c是什么意思 1、首先因为“==”号比“=”的优先级高,所以先执行b==c,明显b等2,c等3两者不等,所以为0(逻辑运算,当b不等c时这个等式的值就为假即是0),再执行a=0,就把0值赋给了a。 2、是A+=A+A+1 优先级等于 A=A+(A+A+1)//A+=B 是 A=A+B 的简化 != 不等于,是条件运算符,用来判断真假的。…

    2024年5月12日
    3800
  • exponentc语言,c语言中的extem

    C语言中的float存储问题,请尽量详细解答,谢谢 1、,其中的e为存储指数的位元的长度。以单精度浮点数为例,它的指数域是8个位元,固定偏移值是2^(8-1)- 1 = 1281 = 12单精度浮点数的指数部分实际取值是从128到-127。 2、:假设那个3是-3,你存储负数时必须在首位一般要加一个符号,那么二进制-3=1000 0011,而1000 001…

    2024年5月12日
    3800
  • c语言lib构成不了程序,c语言build没反应

    在C语言的程序中嵌入了汇编,两个勾选了,lib也加了,但仍报错,求解决方法… 建议你换一个 32 位的汇编编译器 且用32位汇编指令编写 , 不过你得重新学一下 32位的汇编。另外还有一种方法就是 使用VC 编写C语言 , 在C中直接用内联汇编。 在Visual C++ 中使用内联汇编- -使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,…

    2024年5月12日
    3600
  • linuxr语言安装教程,linux安装rndis

    linux系统安装教程? 选择要安装的软件包,可以选择最小化安装或者自定义安装。设置 root 用户的密码。安装引导程序,将 Linux 添加到系统引导菜单中,使其能够在启动时启动。安装完成后重启计算机,进入 Linux 操作系统。 启动计算机:将启动盘插入计算机,然后重启计算机。如果您的计算机不会自动从启动盘启动,请进入计算机的BIOS设置,并将启动顺序设…

    2024年5月12日
    3800
  • c语言圆形体体积计算器,c语言求圆面积,球形体积,圆柱体积

    用C语言编辑计算圆的体积,给定v,r,h这三个符号,最好用float! 在C语言中,球体的体积可以用以下公式表示:V = 4/3 * π * r。其中,r是球的半径。 问题1:可以的。但第7行要改为:scanf(%lf,&r);问题2:printf(圆的周长为:%f\n,2*PI*r); //这个表示在%f这个位置以实数形式输出2*PI*r的值,引号…

    2024年5月12日
    4100

发表回复

登录后才能评论



关注微信