OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2520|回复: 2

求助::VS写的上位机只能发送到串口,无法到单片机

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-9-25
在线时间
1 小时
发表于 2019-9-25 11:15:30 | 显示全部楼层 |阅读模式
1金钱
#include "windows.h"
#include <iostream>  
#include <TCHAR.H>   
#include <string.h>

using namespace std;

HANDLE hCom; //全局变量,串口句柄

int serial_open(LPCWSTR COMx, int BaudRate) {

        hCom = CreateFile(COMx, //COM1口   
                GENERIC_READ | GENERIC_WRITE, //允许读和写   
                0, //独占方式   
                NULL,
                OPEN_EXISTING, //打开而不是创建     
                0, //重叠方式FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED  (同步方式设置为0)
                NULL);
        if (hCom == INVALID_HANDLE_VALUE)
        {
                printf("打开COM失败!\n");
                return FALSE;
        }
        SetupComm(hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小都是1024

        //设定读写超时
        COMMTIMEOUTS TimeOuts;
        TimeOuts.ReadIntervalTimeout=1000;
        TimeOuts.ReadTotalTimeoutMultiplier=500;
        TimeOuts.ReadTotalTimeoutConstant=5000; //设定写超时
        TimeOuts.WriteTotalTimeoutMultiplier=500;
        TimeOuts.WriteTotalTimeoutConstant = 2000;
        SetCommTimeouts(hCom, &TimeOuts); //设置超时
       
        DCB dcb;
        GetCommState(hCom, &dcb);
        dcb.BaudRate = BaudRate;                //设置波特率为BaudRate
        dcb.ByteSize = 8;                                        //每个字节有8位
        dcb.Parity = NOPARITY;                        //无奇偶校验位
        dcb.StopBits = ONESTOPBIT;                //一个停止位
        SetCommState(hCom, &dcb);                //设置参数到hCom
        PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓存区                //PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。
        //PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。
        //PURGE_TXCLEAR 清除输出缓冲区
        //PURGE_RXCLEAR 清除输入缓冲区  
        return TRUE;
}
int serial_write(char lpOutBuffer[])        //同步写串口
{
        DWORD dwBytesWrite = sizeof(lpOutBuffer);
        COMSTAT ComStat;
        DWORD dwErrorFlags;
        BOOL bWriteStat;
        ClearCommError(hCom, &dwErrorFlags, &ComStat);
        bWriteStat = WriteFile(hCom, lpOutBuffer, dwBytesWrite, &dwBytesWrite, NULL);
        if (!bWriteStat)
        {
                printf("写串口失败!\n");
                return FALSE;
        }
        PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
        return TRUE;
}
void Serial_close(void)                //关闭串口
{
        CloseHandle(hCom);
}
int main()
{
        serial_open(_T("COM1"), 9600); //打开COM1,波特率为4800
        serial_write("'5'");//发送字符a
        Serial_close();//关闭串口
        system("pause");
        return 0;
}
用VS写的这个C++程序只能发送到串口   隐藏在串口助手的发送内容中   必须点串口助手的发送才能发送到stm32上  求大神帮我看一下程序哪里需要更正
微信图片_20190925111438.png

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14422
金钱
14422
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-9-25 14:56:37 | 显示全部楼层
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2019-9-25 15:17:45 | 显示全部楼层
serial_write("'5'");//发送字符a
引号不太对。
在单片机端下个断点看下是不是又消息到达。
另外,串口助手那里勾选了发送新行,说明是发送了两个额外字符\r\n,单片机端也是判断有这两个字符才认为发送有效而且完毕,你的上位机没发送新行,所以单片机没回应。但是单片机没回应的原因不只是发送的数据没有新行,还有可能单片机没收到,所以要在单片机端下断点看下是否收到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 23:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表