VS2013用C写串口收发数据,发送数据没问题,然后自己接收奇怪的错误

sinat_23039991 2017-11-22 10:12:04
我要收发的数据都是一组为24个字节,所以使用的ReadFile和WriteFile函数把要收发的数据放到了一个24字节是数组里,来进行传输。波特率校验位都设置的一样,但是收的数据会出现固定的10-13的四个字节的错误,而且错误形式一样,十六进制都是18 00 00 00这样四个数据,每组数据都是这四个字节出错。希望有经验的大神帮忙指导一下。附代码和错误。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include "tchar.h"

int main()
{
HANDLE hCom1;
hCom1 = CreateFile(_T("COM1"),//COM1口
GENERIC_READ | GENERIC_WRITE,//允许读和写
0,//独占方式
NULL,
OPEN_EXISTING,//打开而不是创建
0,//同步方式
NULL);
if (hCom1 == (HANDLE)-1)
{
printf("打开COM失败!\n");
return FALSE;
}
else
{
printf("COM打开成功!\n");
}
SetupComm(hCom1, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout = 1000;
TimeOuts.ReadTotalTimeoutMultiplier = 500;
TimeOuts.ReadTotalTimeoutConstant = 5000;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 500;
TimeOuts.WriteTotalTimeoutConstant = 2000;
SetCommTimeouts(hCom1, &TimeOuts);//设置超时
DCB dcb1;
GetCommState(hCom1, &dcb1);
dcb1.BaudRate = 115200;//波特率为9600
dcb1.ByteSize = 8;//每个字节有8位
dcb1.Parity = NOPARITY;//无奇偶校验位
dcb1.StopBits = TWOSTOPBITS;//两个停止位
dcb1.fParity = FALSE;
dcb1.fNull = FALSE;
SetCommState(hCom1, &dcb1);
DWORD wCount=8;//读取的字节数

while (1)
{
PurgeComm(hCom1, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓冲区
unsigned char str[] = { 0 };
if (!ReadFile(hCom1, str, wCount, &wCount, NULL))
{
printf("读串口失败!");
return FALSE;
}
FILE *fp1;
fp1 = fopen("串口发送的数据11.txt", "a+");
int i = 0;

for (i = 0; i < wCount; i++)
{

printf("读串口成功!读取数据为: %02X \n", str[i]);
fprintf(fp1, "%02X ", str[i]);

}



fclose(fp1);
}
CloseHandle(hCom1);
}

...全文
709 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SHNwjt 2019-01-30
  • 打赏
  • 举报
回复
为啥我运行后啥数据也没有
sinat_23039991 2017-11-27
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include "tchar.h"

int main() {
    HANDLE hCom1;
    hCom1 = CreateFile(_T("COM1"),//COM1口
                       GENERIC_READ | GENERIC_WRITE,//允许读和写
                       0,//独占方式
                       NULL,
                       OPEN_EXISTING,//打开而不是创建
                       0,//同步方式
                       NULL);
    if (hCom1 == (HANDLE)-1) {
        printf("打开COM失败!\n");
        return FALSE;
    } else {
        printf("COM打开成功!\n");
    }
    SetupComm(hCom1, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
    COMMTIMEOUTS TimeOuts;
    //设定读超时
    TimeOuts.ReadIntervalTimeout = 1000;
    TimeOuts.ReadTotalTimeoutMultiplier = 500;
    TimeOuts.ReadTotalTimeoutConstant = 5000;
    //设定写超时
    TimeOuts.WriteTotalTimeoutMultiplier = 500;
    TimeOuts.WriteTotalTimeoutConstant = 2000;
    SetCommTimeouts(hCom1, &TimeOuts);//设置超时
    DCB dcb1;
    GetCommState(hCom1, &dcb1);
    dcb1.BaudRate = 115200;//波特率为9600
    dcb1.ByteSize = 8;//每个字节有8位
    dcb1.Parity = NOPARITY;//无奇偶校验位
    dcb1.StopBits = TWOSTOPBITS;//两个停止位
    dcb1.fParity = FALSE;
    dcb1.fNull = FALSE;
    SetCommState(hCom1, &dcb1);
    DWORD wCount,n;//读取的字节数
    FILE *fp1;
    fp1 = fopen("串口发送的数据11.txt", "a+");
    unsigned char str[8];
//  PurgeComm(hCom1, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓冲区
    n=0;
    while (1) {
        wCount=8;
        if (!ReadFile(hCom1, str, wCount, &wCount, NULL)) {
            printf("读串口失败!");
            break;
        }
        for (i = 0; i < wCount; i++) {
            fprintf(fp1, "%02X ", str[i]);
            printf("%02X ",str[i]);
            if (n%16==0) printf("\n %08X - ",n);
            if (n%320==0) system("cls");
            n++;
            printf("%02X ",str[i]);
        }
        fflush(fp1);
    }
    fclose(fp1);
    CloseHandle(hCom1);
}
非常感谢,把wCount改成8就可以了,老师真的非常感谢。祝您工作顺利,天天开心哦!
赵4老师 2017-11-25
  • 打赏
  • 举报
回复
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include "tchar.h"

int main() {
    HANDLE hCom1;
    hCom1 = CreateFile(_T("COM1"),//COM1口
                       GENERIC_READ | GENERIC_WRITE,//允许读和写
                       0,//独占方式
                       NULL,
                       OPEN_EXISTING,//打开而不是创建
                       0,//同步方式
                       NULL);
    if (hCom1 == (HANDLE)-1) {
        printf("打开COM失败!\n");
        return FALSE;
    } else {
        printf("COM打开成功!\n");
    }
    SetupComm(hCom1, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
    COMMTIMEOUTS TimeOuts;
    //设定读超时
    TimeOuts.ReadIntervalTimeout = 1000;
    TimeOuts.ReadTotalTimeoutMultiplier = 500;
    TimeOuts.ReadTotalTimeoutConstant = 5000;
    //设定写超时
    TimeOuts.WriteTotalTimeoutMultiplier = 500;
    TimeOuts.WriteTotalTimeoutConstant = 2000;
    SetCommTimeouts(hCom1, &TimeOuts);//设置超时
    DCB dcb1;
    GetCommState(hCom1, &dcb1);
    dcb1.BaudRate = 115200;//波特率为9600
    dcb1.ByteSize = 8;//每个字节有8位
    dcb1.Parity = NOPARITY;//无奇偶校验位
    dcb1.StopBits = TWOSTOPBITS;//两个停止位
    dcb1.fParity = FALSE;
    dcb1.fNull = FALSE;
    SetCommState(hCom1, &dcb1);
    DWORD wCount,n;//读取的字节数
    FILE *fp1;
    fp1 = fopen("串口发送的数据11.txt", "a+");
    unsigned char str[8];
//  PurgeComm(hCom1, PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓冲区
    n=0;
    while (1) {
        wCount=8;
        if (!ReadFile(hCom1, str, wCount, &wCount, NULL)) {
            printf("读串口失败!");
            break;
        }
        for (i = 0; i < wCount; i++) {
            fprintf(fp1, "%02X ", str[i]);
            printf("%02X ",str[i]);
            if (n%16==0) printf("\n %08X - ",n);
            if (n%320==0) system("cls");
            n++;
            printf("%02X ",str[i]);
        }
        fflush(fp1);
    }
    fclose(fp1);
    CloseHandle(hCom1);
}
sinat_23039991 2017-11-24
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
如果pormon中显示的数据没错而你的程序有错,那就是你接收数据或显示数据出错; 如果pormon中显示的数据也出错,那就是串口参数设置或硬件传输出错。
老师您好,我用串口助手接收到的数据和发送的数据一致没有问题。但是串口助手不能保存全部的数据,所以我还是接收程序的问题,还是上述的问题,把wCount变大一点,还是固定的那四个字节出错,其他没有错误。但是那个wCount只能到24*10,再大就会读串口失败。您能接着帮我指导一下程序中的错误吗?非常感谢!
赵4老师 2017-11-22
  • 打赏
  • 举报
回复
推荐使用portmon软件辅助调试串口通信程序。
赵4老师 2017-11-22
  • 打赏
  • 举报
回复
数据线太长?
赵4老师 2017-11-22
  • 打赏
  • 举报
回复
portmon
赵4老师 2017-11-22
  • 打赏
  • 举报
回复
如果pormon中显示的数据没错而你的程序有错,那就是你接收数据或显示数据出错; 如果pormon中显示的数据也出错,那就是串口参数设置或硬件传输出错。
sinat_23039991 2017-11-22
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
portmon更底层,实现了串口抓包。
引用 5 楼 zhao4zhong1 的回复:
portmon更底层,实现了串口抓包。
那我接收程序可能是哪里出错了呢,固定的错误是怎么回事呢,感谢您的回复
赵4老师 2017-11-22
  • 打赏
  • 举报
回复
portmon更底层,实现了串口抓包。
sinat_23039991 2017-11-22
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
推荐使用portmon软件辅助调试串口通信程序。
这个串口助手有什么优势吗,我就用的普通的串口助手
sinat_23039991 2017-11-22
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
数据线太长?
跟数据线长度没关吧,我用虚拟串口调试也是一样的错误。我想把读取的数据组弄大点,但是那样就读取失败了,最多能读取多少个字节呢

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧