精华内容
下载资源
问答
  • 我用auduino的串口向人机界面发送了16进制数据串,例如:发送【013E0088A3】人机界面马上会返回一串16进制数【013E0423322E87EFA4】,所以发送完数据后需要马上开始接收,怎么写程序能...我用auduino的串口向人机...

    我用auduino的串口向人机界面发送了16进制数据串,例如:发送【013E0088A3】人机界面马上会返回一串16进制数【013E0423322E87EFA4】,所以发送完数据后需要马上开始接收,怎么写程序能...

    我用auduino的串口向人机界面发送了16进制数据串,例如: 发送【 01 3E 00 88 A3】 人机界面马上会返回一串16进制数 【01 3E 04 23 32 2E 87 EF A4】 ,所以发送完数据后需要马上开始接收,怎么写程序能不漏掉数据,怎么样能够及时准确的接收数据,接收到以后需要把它存在数组中再判断或提取数据

    /*********************************** 下面是串口发送16进制串的函数 *******************************************/

    void UART_SendPacked(unsigned char Command,unsigned char *p,unsigned char num)

    {

    unsigned char Index=0;

    unsigned char check=0;

    while(UART_TX_Status==1);//等待串口空闲

    UART_TX_Status = 1;//,串口忙标志置1,开始新一轮传输

    Serial.flush();//Clear serial_buf

    UART_TX_Buffer[Index++] = 0x55; //UART_TX_Buffer[0]=Command;命令1字节

    UART_TX_Buffer[Index++] = num+1; //UART_TX_Buffer[1]=num+1;长度1字节

    UART_TX_Buffer[Index++] = Command; //校验=命令+数据(num+1字节)和取低8位

    check = Command;

    while(num--)//计算校验值(在Command基础上继续累加num个数据)得到校验原值

    {

    UART_TX_Buffer[Index++] = *p;

    check += *p++;

    }

    UART_TX_Buffer[Index++] = check;// 校验原值的低8位【1个字节】作为校验值

    UART_TX_Buffer[Index++] = 0xaa;//结束标志:0xAA

    UART_TX_Number = Index;//所有数据已写入数组中,得到数组长度

    Serial.write(UART_TX_Buffer,UART_TX_Number);

    UART_TX_Status=0;

    }

    /* 例如,执行下面函数会发送16进制串,屏幕收到后会进入休眠,并返回一串16进制数给arduino */

    void LCDSetWaitMode(void)//一级休眠

    {

    Send_Buffer[0] = 0xa5;

    UART_SendPacked(0x8c,Send_Buffer,1);

    }

    /*然后就是怎么接收返回的16进制串的问题,我是这样写的,但是不放心,觉得不靠谱,还请大家帮忙*/

    // 分数不够了,大家谅解一下,感谢!

    void rev(int num_rev)

    {

    Serial.flush(); //清空串口缓存区

    while(Serial.read() >= 0); //这句好像也是可以清空串口缓存区,好像用上面那句的话有时候会有旧数 据,不能全部替换为新数据,前几天遇到过这个问题,很奇怪。

    if(Serial.available())

    {

    Receive_Buffer[cc++]=Serial.read();

    }

    if(cc>num_rev)

    {

    Serial.write(Receive_Buffer,cc);

    cc=0;

    }

    }

    展开

    展开全文
  • 常见的通讯接口有USART、CAN、USB、Ethernet。最常见、用的最多的就是USART,下面主要对串口通讯协议的物理层及协议层进行讲解。... 使用RS-232标准的串口设备间常见的通讯结构见图1 图1 串口通讯结...

    常见的通讯接口有USART、CAN、USB、Ethernet。最常见、用的最多的就是USART,下面主要对串口通讯协议的物理层及协议层进行讲解。

    1. 物理层

    串口通讯的物理层有很多标准及变种,主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

    使用RS-232标准的串口设备间常见的通讯结构见图1

    54d531b06c6b172b55c9f48e4b09a203.png

    图1 串口通讯结构图

    上面的通讯方式中,两个设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器识别,所以这些信号需要经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。

    1.1 电平标准

    根据通讯使用的电平标准不同,串口通讯可以分为TTL标准及RS-232标准,见表1。

    bb4229d6e60f7ec9e46a694c41afd235.png

    表1 TTL电平标准与RS-232电平标准

    1.2 RS-232信号线

    在最初的应用中,RS-232串口标准常用于计算机、路由器与调制解调器之间的通讯。通讯信号线见图2,通讯信号线说明可以去网上搜相关资料。

    033c2fcc54d4c93d26367ec0a0b33307.png

    图2 RS-232 信号线

    2. 协议层

    串口通讯的数据包由发送端通过自身的TXD接口经串口信号线传输到接收端的RXD接口。在串口通讯的协议中,规定了数据包的内容,它由起始位、数据、校验位及停止位组成。通讯双方的数据包格式及波特率要一致才能正常收发数据。数据包组成结构图见图3。

    ee0cfc6b48c913b7965e8e97ce8006d2.png

    图3 数据包的组成结构图

    以上对串口通讯物理层及协议层做了简单介绍,下篇讲一下串口接收数据的处理方法及串口收发数据结构封装。

    展开全文
  • 代码不会在下面运行,但它应该可以帮助您解决问题 .它尝试做的是将inData拆分为Tokens []数组 .然后它使用atoi()语句将ASCII数据转换为整数 .希望能帮助到你 .bool started = false;bool ended = false;...

    代码不会在下面运行,但它应该可以帮助您解决问题 .

    它尝试做的是将inData拆分为Tokens []数组 .

    然后它使用atoi()语句将ASCII数据转换为整数 .

    希望能帮助到你 .

    bool started = false;

    bool ended = false;

    char inData[5];

    byte index;

    void setup()

    {

    Serial.begin(9600);

    }

    void loop()

    {

    while (Serial.available() > 0)

    {

    char inChar = Serial.read();

    if (inChar == '

    {

    index = 0;

    started = true;

    ended = false;

    }

    else if (inChar == '>')

    {

    ended = true;

    break;

    }

    else

    {

    inData[index] = inChar;

    index++;

    }

    if (started && ended)

    {

    // https://stackoverflow.com/questions/2227198/segmentation-fault-when-using-strtok-r

    // Splint up input data

    char *p = inData;

    char *tokens[50];

    int i = 0;

    while (i < 50) {

    tokens[i] = strtok_r(p, ",", &p);

    if (tokens[i] == NULL) {

    break;

    }

    i++;

    }

    if (tokens[0] == '

    {

    pinMode(tokens[1],OUTPUT);

    analogWrite(tokens[2],tokens[3]);

    }

    else if (token[0] == '

    {

    if (atoi(token[3]) == 1)

    {

    pinMode(atoi(token[1]),OUTPUT);

    digitalWrite(atoi(token[1]),HIGH);

    }

    else if (atoi(tokens[3]) == 0)

    {

    pinMode(atoi(tokens[1]),OUTPUT);

    digitalWrite(atoi(tokens[1]),LOW);

    }

    }

    started = false;

    ended = false;

    index = 0;

    }

    }

    展开全文
  • //设置超时 /*****************************************配置串口***************************/ DCB dcb; GetCommState(hCom, &dcb); dcb.BaudRate = 9600; //波特率为9600 dcb.ByteSize = 8; //每个字节有8位 dcb....

    这是arduino端

    [mw_shl_code=arduino,true]void setup() {

    Serial.begin(9600);

    }

    void loop() {

    Serial.println("500");

    }[/mw_shl_code]

    这是c语言端

    [mw_shl_code=c,true]#include

    #include

    HANDLE hCom;

    int main(void)

    {

    char prt[3] = {0};

    int i = 0;

    hCom = CreateFile(TEXT("com3"),//COM1口

    GENERIC_READ, //允许读

    0, //指定共享属性,由于串口不能共享,所以该参数必须为0

    NULL,

    OPEN_EXISTING, //打开而不是创建

    FILE_ATTRIBUTE_NORMAL, //属性描述,该值为FILE_FLAG_OVERLAPPED,表示使用异步I/O,该参数为0,表示同步I/O操作

    NULL);

    if (hCom == INVALID_HANDLE_VALUE)

    {

    printf("打开COM失败!\n");

    return FALSE;

    }

    else

    {

    printf("COM打开成功!\n");

    }

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

    /*********************************超时设置**************************************/

    COMMTIMEOUTS TimeOuts;

    //设定读超时

    TimeOuts.ReadIntervalTimeout = MAXDWORD;//读间隔超时

    TimeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数

    TimeOuts.ReadTotalTimeoutConstant = 0;//读时间常量

    //设定写超时

    TimeOuts.WriteTotalTimeoutMultiplier = 1;//写时间系数

    TimeOuts.WriteTotalTimeoutConstant = 1;//写时间常量

    SetCommTimeouts(hCom, &TimeOuts); //设置超时

    /*****************************************配置串口***************************/

    DCB dcb;

    GetCommState(hCom, &dcb);

    dcb.BaudRate = 9600; //波特率为9600

    dcb.ByteSize = 8; //每个字节有8位

    dcb.Parity = NOPARITY; //无奇偶校验位

    dcb.StopBits = ONESTOPBIT; //一个停止位

    SetCommState(hCom, &dcb);

    DWORD wCount;//实际读取的字节数

    bool bReadStat;

    char str[2] = { 0 };

    while (1)

    {

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

    bReadStat = ReadFile(hCom, str, sizeof(str), &wCount, NULL);

    if (!bReadStat)

    {

    printf("读串口失败!");

    return FALSE;

    }

    else

    {

    //str[1] = '\0';

    if(str[0]>='0'&&str[0]<='9')

    {

    prt= str[0];

    i++;

    }

    if(i == 3)

    {

    printf("%s\n",prt);

    i=0;

    }

    //printf("%c\n", str[0]);

    }

    Sleep(1);

    }

    CloseHandle(hCom);

    }[/mw_shl_code]

    回读数据会错位,能烦请各位解决一下吗

    回读数据如下:

    500

    550

    050

    055

    005

    005

    005

    055

    005

    005

    500

    500

    550

    050

    055

    展开全文
  • 我是Arduino初学者,今日尝试用Arduino nano 收串口发来16进制数据,再由软串口转发给下级设备,下级设备返回16进制数据。首先简单测试代码如下:#include SoftwareSerial mySerial(2,3);void setup(){Serial.begin...
  • 这些避免外部时钟信号的机制是: Synchronization bits 同步位 Data bits 数据位 Parity bits 奇偶校验位 Baud rate 波特率 同步位 同步位是与每个数据包传输的两个或三个特殊位。它们是起始位和停止位。正如...
  • 能让电脑和Arduino直接通讯的方式当然是串口了,因为Arduino自带的IDE里面就有串口工具,而Arduino板上恰恰集成了串口的功能,因此搞起来很方便。不要小看这个串口哦,里面蕴含着无尽的编程知识,甚至学习C语言用这...
  • int zhengshu; String zifu="";//全局变量void setup() {Serial.... }//串口调试void loop(){Serial.println(zifu);Serial.print("shuzi:");Serial.println(zhengshu);delay(1000);}void serialEvent(){String in...
  • 接受串口数据 ser = serial.Serial(serialPosrt, baudRate, timeout=timeout) # 循环获取数据(条件始终为真) while 1: # 读取接收到的数据的第一行 str = ser.readline() # 把数据打印到终端显示 print(str) [/dsx_...
  • 最后,接收UART将数据包并行传输到接收端的数据总线: UART传输的数据被组织成数据包。每个数据包包含1个起始位,5到9个数据位(取决于UART),可选的奇偶校验位以及1或2个停止位: 1 开始位 当UART数据传输线不传输...
  • 连接完成后是这样的: 三、总体思路 用树莓派通过API获取博客今天的访问量,用串口将访问量发送给Arduino ,Arduino通过串口接收到访问量的数据后,用lcd1602显示出来。 参考文章: 树莓派获取博客今天的访问量:...
  • 通过RXTXcomm.jar控制串口接收和发送数据,本人自己写的包.
  • 以下是根据你的提示写的程序,比较乱。写的自己都乱了。高手给指点下。#include #include <1602.h>sbit dula=P2^6;sbit wela=P2^7;...//时区#defineREC_MAX 6 //定义数据包大小#defineCHECK_HEAD0xFF ...
  • 求助大佬们关于STM32串口解析数据包的程序 使用的STM32CUBE IDE自带的HAL,想要通过串口发送信息给单片机. 例如给1号单片机发送233这个数据,发送格式为:编号+数据位数+数据...
  • #5% 6021c08dc2abb6 d4ee072934b6ac ... 串口连续接收到这样格式的数据包,大小是随机的,#16%是包头,@是包尾, 怎样去掉包头和包尾,并且把每行14位数据的第3—8位在edit中显示出来,急求详解啊啊啊。。
  • stm32串口接收完整的数据包

    千次阅读 2019-07-18 17:04:30
    参考了文章:《stm32串口中断接收方式详细比较》 文章地址:http://bbs.elecfans.com/jishu_357017_1_1.html 借鉴了第四种中断方式 串口的配置这里不做说明,仅对stm32接收中断中的数据进行解析。 数据...
  • 串口接收完整一帧数据包的3种方法

    千次阅读 2020-06-25 20:08:07
    本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行...
  • 今天小编就为大家分享一篇Python3 串口接收与发送16进制数据包的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Python3 串口接收与发送16进制数据包,及字符串

    万次阅读 多人点赞 2018-08-09 14:27:00
    Python3 串口接收与发送16进制数据包,及字符串 将最简化的程序做到功能完善。 注意: #sleep() 与 inWaiting() 最好配对使用,不然 返回的num可能等于0 time.sleep(1)  num=t.inWaiting() #如果不使用 此行...
  • 我用的是STC15l2k60s2,最近在网上买了个mpu6050模块,它是通过串口分别发送加速度,角速度,角度三个数据包,包头都为0x55,第二个数据为标识分别是0x51,0x52,0x53,但是串口接收到的总是不完整的数据,想问问...
  • Python3 串口接收与发送16进制数据包

    万次阅读 2015-01-07 13:13:04
    import serial import string import binascii s=serial.Serial('com4',9600) s.open() #接收 n=s.inwaiting() if n: data= str(binascii.b2a_hex(s.read(n)))[2:-1] print(data) #发送 d=bytes.fromhex('10 1
  • 串口发送与接收

    千次阅读 2018-08-01 00:19:53
    这几天想弄一个串口接收数据包,定时器中断发送事件,然后在任务中处理接收的数据。没想到一开始就在串口上栽了一个跟头。 1、用串口1发送数据包,串口而接收。初始化程序参考正点原子串口初始化。 发送数据包函数...
  • 在MCU的应用中,经常需要通过串口进行不定长数据包的传输。发送方很简单,不需特别的考虑,而接收方则需要能够侦测到数据包的结束。接收方的简单做法是结合串口的IDLE中断,或...
  • [Matlab]Simulink串口接收详解2用S-Function解析数据包

    千次阅读 多人点赞 2018-06-29 14:39:48
    [Matlab] Simulink 串口接收详解1 中,讲了一下 Serial Precive 模块的简单用法,但是有时候我们接收的数据是具有复杂定义的数据包。这个时候就需要自己对得到数据进行2次解析。 1.1. S-Function模块设置 ...
  • 本文为看雪论坛优秀文章看雪论坛作者ID:二当家aLoRa 固件目前有一个 需求,为了研究lora 在不同干扰情况下数据包字节错误的情况,我必须将错误的数据包也记录下来,即没有通过CRC校验的数据包。但是现有的lora固件...
  • TinyOS串口数据包解析

    千次阅读 2014-03-05 08:59:18
    TinyOS中的串口协议是这样规定节点和PC机通信时双方通过同步自己来交换数据,也就是节点或者PC机在每次发送数据给对方时都会先发送一个同步字节0x7e,紧跟同步字节之后的就是数据包。而数据包也有特定的格式:  1....
  • 这里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包。过程涉及到封包与解包。设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性。串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2C的...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 347
精华内容 138
关键字:

串口接收数据包