精华内容
下载资源
问答
  • //初始化串口 #ifdef __linux__ memset(tmp,0,128); if (commtype==0) sprintf(tmp, "stty , _DEVNAME_,TCP_IP_Start - ProjectNo + SER_Start);//,1200 , "even", 1, 8); else sprintf(tmp, ...
  • 以《Visual C++/Turobo C串口通信编程实践》(龚建伟 熊光明 著)一书中第二章的SerialPortTest程序为例,当在Visual C++ .NET下编写后之后,debug之后,会出现编译错误:“operator+="不明确,MSDN解释“为重载...

    CSerialPort类在Visual C++ .NET 应用时会出现意想不到的问题。以《Visual C++/Turobo C串口通信编程实践》(龚建伟 熊光明 著)一书中第二章的SerialPortTest程序为例,当在Visual C++ .NET下编写后之后,debug之后,会出现编译错误:“operator+="不明确,MSDN解释“为重载运算符定
    义了多个可能的运算符。可能的解决方案:对一个或多个实际参数使用显式转换。”当将
     
    LONG CSerialPortTestDlg::OnComm(WPARAM ch, LPARAM port)
    {
    m_strEditReceiveMsg +=ch;
    UpdateData(FALSE); //将接收到的字符显示在接收编辑框中
    return 0;
    }
     
    中m_strEditReceiveMsg +=ch;改写为m_strEditReceiveMsg +=char(ch);后,debug顺利通过了。其实这个还不是CSerialPort类的问题。m_strEditReceiveMsg+=ch;改写为m_strEditReceiveMsg +=char(ch) 是应该的,这样更为严谨,因为在 OnComm(WPARAM ch, LPARAM port)函数中,ch 为 WPARAM 型数据,WPARAM型数据适应型很强,char(ch)将ch强制转换为char型,更适合CString型,这应该算是VC.NET的进步。
     
    当将这个问题解决之后,编译成功了。然后开始测试。向串口调试助手发送消息时一切正常。但从串口调试助手向SerialPortTest发送消息时,报错了,说“comstat is being used without defining",在SerialPort.CPP中,可以找到comstat的定义:COMSTAT comstat; 但将光标指向comstat时右键转到定义处或声明处,却均提示“未定义符号”,这便是CSerialPort类在VC.NET应用中的问题了。那该如何解决这个问题呢?在这,我们向大家提供两种解决方案:
     
    方案1: 改变项目配置属性
     
    一种解决方案是改变基本运行时检查(changing the runtime checks in project settings):在菜单Project->Project properties-> C/C++ -> Code generation-> Basic Runtime checks --> change to ´Default´,在中文版中是:项目-〉属性-〉配置属性-〉C/C++代码生成-〉基本运行时检查-〉设置为默认,当将基本运行时检查改为默认之后,编译自然顺利通过了,向串口调试助手发送消息正常了,再从串口调试助手向SerialPortTest发送消息时,也正常了。
     
    方案2:改变comstat变量属性
     
    另一种解决方案是将CSerialPort.CPP中的COMSTAT comstat;改为static COMSTAT comstat;这样改了之后,debug顺利通过,然后调试,与串口调试助手相互发消息都OK了。为什么这样就能解决呢?其实当你使用debug解决方案时,它的基本运行时检查初始设置为:两者(/RTC1,等同于 /RTCsu),这个两者是指:堆栈帧(/RTCs),未初始化的变量(/RTCu)。由于它要检查未初始化的变量,所以将SerialPort.cpp中的COMSTAT comstat;改为static COMSTAT comstat;就可以正常使用CSerialPort类了。
     以上是在debug下的解决方案,当在Release编译状态时,你会发现并不需要将COMSTAT comstat;改为static COMSTAT comstat;就能编译成功并且发送接收消息正常。其实,在Release下,它的基本运行时检查初始设置已为默认。这应该也算是第一种解决方案之内。
     而当你将它设置为两者(/RTC1,等同于 /RTCsu)时,不论是否将COMSTAT comstat;改为static COMSTAT comstat;,编译都不能通过,报错““cl.exe”返回的结果有误。",这个应该是属于Release的问题了,另当别论了。


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oemoon/archive/2011/04/03/6300368.aspx

    展开全文
  • 先将串口通信的初始化程序从STC-ISP软件中的波特率计算器中,把初始化程序导出来 对于STC15f2k60S2的单片机来讲,用串口1,定时器1的就可以 如果要开串口中断的话,记得串口中断号为4,即,interrupt 4 首先得解释...

    先将串口通信的初始化程序从STC-ISP软件中的波特率计算器中,把初始化程序导出来
    对于STC15f2k60S2的单片机来讲,用串口1,定时器1的就可以
    如果要开串口中断的话,记得串口中断号为4,即,interrupt 4

    首先得解释一下,RI,TI
    RI可以想成是Receive接受这个单词代表的,一般情况下等于0,
    当单片机接收到PC机上发的消息,就会被置1,通常需要用软件再置0,才能继续正常工作
    TI可以想成是Text接受这个单词代表的,一般情况下等于0,
    当PC机接收到单片机上发的消息,就会被置1,通常需要用软件再置0,才能继续正常工作

    简单的PC向单片机发送十六进制的数据:

            if(RI==1)
            {
                RI=0;
                P2=0x80;
                P0=SBUF;
            }
    PC发送字符到数码管上显示(发字符串的话,我觉得不得行,但是可以如下两例子):
            if(RI==1)
            {
                RI=0;
                yi=SBUF;
            }
    发字符,然后判断,这个是在中断里的
            void ser() interrupt 4//串口中断号为4
            {
                RI=0;
                num=SBUF;
                if(num==’$’)
                {
                    P2=0x80;P0=0x55;
                }
            }

    注:发送字符串的话,需要把发送串口调整到文本模式

    接下来是,单片机向PC机发送数据:
    单片机向PC机发送字符串好说,就这个函数添上去调用就可以了
    void send(uchar *p)
    {
        uchar index=0;
        do
        {
            SBUF=p[index++];
            while(TI==0);
            TI=0;
        }while(p[index]!=0);
    }
    单片机向PC机发送数字就有点不好弄了,我们接着看
        strcmp()函数属于头文件为string.h的头文件里
        if(strcmp(anhao,"AAASSS")==0)//为0的时候相等
        {
            anhao_chuan=1;
        }
    向PC机发送数字的话,还是用sprintf(zifu,%d,num)函数比较好
    其中sprintf(zifu,"%d",num);属于头文件<stdio.h>
    zifu为存储转化后的字符的数组,num为需要转化的数字
    之后再调用上面send(zifu);发送就可以
    例如:
        sprintf(zifu,"%d",num);
        send(zifu);

    展开全文
  • 1、uboot (负责初始化基本硬du件,如串口,网卡,usb口等,然zhi后引导系统dao运行) 2、linux系统 (真正的操作系统) 3、你的应用程序 (基于操作系统的软件应用) 当你开发板上电时,uboot运行,就会把串口设备...

    板子软件bai分三部分:
    1、uboot (负责初始化基本硬du件,如串口,网卡,usb口等,然zhi后引导系统dao运行)
    2、linux系统 (真正的操作系统)
    3、你的应用程序 (基于操作系统的软件应用)
    当你开发板上电时,uboot运行,就会把串口设备初始化好,能够往串口输出打印信息。还可以接受你透过电脑的串口助手从串口发来的信息。它把你的信息解释成命令,然后转到系统执行。

    展开全文
  • visual C++_Turbo C串口通信编程实践

    热门讨论 2010-07-30 09:14:24
    5.2 串口初始化及关闭 5.3串口数据的发送与接收及十六进制数据的处理 5.3.1 十六进数据发送处理 5.3.2 手动发送处理 5.3.3自动发送处理 5.3.4 接收处理及十六进制显示 5.4 其它辅助功能的实现 5.4.1 接收...
  • 解单解释一下,第一部分代码是初始化函数,用来初始化串口并将串口的波特率设置为115200。第二部分是一个死循环函数,我们这里可以将其理解为while(1),他的作用就是让内部的函数一直执行,从而可以达到监视窗口的...

     

    一、基本使用


    ESP32有三个串口,编号分别为0、1、2。这里不多解释。

     

    输出“hello world”的程序。

    在这里插入图片描述

    解单解释一下,第一部分代码是初始化函数,用来初始化串口并将串口的波特率设置为115200。第二部分是一个死循环函数,我们这里可以将其理解为while(1),他的作用就是让内部的函数一直执行,从而可以达到监视窗口的目的。

    然后我们将串口数据的接收和发送程序下载到开发板(详情见上一期)

    #include <HardwareSerial.h>    
    HardwareSerial MySerial_stm32(1);  
    unsigned short i;
    char temp;
    //这个函数适用于清理串口读取缓存区的缓存,其实也就是用读一个删除一个的方式清理,我还会打印出有没有进行清理,清理了哪些内容
    void clear_usart_buffer(){
      i = MySerial_stm32.available();
      if(i != 0){
        Serial.print("清空串口接收区的缓存......");
        Serial.println(MySerial_stm32.available());
        while(i--)
          MySerial_stm32.read();    //读取串口接收回来的数据但是不做处理只给与打印
        }
      else
        Serial.println("串口接收区的缓存为空!!!");
      }
       
    /
    void read_usart(){
      i = MySerial_stm32.available();  //返回目前串口接收区内的已经接受的数据量
      if(i != 0){
        Serial.print("串口接收到的数据量为:");
        Serial.println(MySerial_stm32.available());
        while(i--){
          temp = MySerial_stm32.read();   //读取一个数据并且将它从缓存区删除
          Serial.print(temp);    //读取串口接收回来的数据但是不做处理只给与打印
          }
        Serial.println("");
        //data_analyse();    //至关重要的一步,也就是把读取回来的数据进行分步截取直接拿到我们想要的数据,我下一篇博文会讲如何自己写这个函数
        }
      else
        Serial.println("串口接收区没有数据!!!");
      }
     
    void setup() {
      Serial.begin(115200);
      //串口的开启,这里还可以传一些别的参数,但是我们只传入下面四个最重要的:波特率,默认SERIAL_8N1为8位数据位、无校验、1位停止位,后面两个分别为 RXD,TXD 引脚
      MySerial_stm32.begin(115200, SERIAL_8N1, 14, 15);
      //MySerial_stm32.updateBaudRate(9600);  //重新设置波特率;  
      //MySerial_stm32.end();  //失能串口,释放占用的资源
      clear_usart_buffer();  //清空接收区缓存函数
      
    }
     
    void loop() {
      MySerial_stm32.println("usart test!!!");
      read_usart();
      delay(500);
      read_usart();
      delay(500);
      read_usart();
      delay(500);
    }

    二、存在的问题


    使用Serial1(U1TXD=GPIO10,U1RXD=GPIO9)时程序无法正常运行。接收数据时只能接收到一次。这让我很是头疼。后来查阅相关资料后。发现是开发版自身的问题,《ESP32 技术规格书》中明确的写到,ESP32的GPIO6~11一般用于连接外部Flash芯片在这里插入图片描述

    但是Serial1默认使用了GPIO9和10,从而导致程序崩溃:

    解决方法一

    使用另一个串口,但是实际操作后还是不可以。


    解决方法二

    使用HardwareSerial库
    ESP32片上功能模组所发出的信号可映射到任何 GPIO管脚,使用Arduino core for the ESP32中自带的HardwareSerial库就可以将串口RX映射到几乎所有IO口上,TX映射到GPIO0~31上。

    在这里插入图片描述

    代码如下:注意RX接5号IO口,TX接18号IO口。波特率默认115200.

    HardwareSerial mySerial1(1);
    
    void setup()
    
    {
    
    mySerial1.begin(115200,SERIAL_8N1,5,18);
    
    }
    
    void loop()
    
    {mySerial1.println("hello world");
    
    dalay(1000);
    
    }
    void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
    使能串口,参数如下:
    baud:串口波特率,该值写0则会进入自动侦测波特率程序;
    config:串口参数,默认SERIAL_8N1为8位数据位、无校验、1位停止位;
    rxPin:接收管脚针脚号;
    txPin:发送管脚针脚号;
    invert:翻转逻辑电平,串口默认高电平为1、低电平为0;
    timeout_ms:自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口;
    
    void end();
    失能串口,释放资源;
    
    void updateBaudRate(unsigned long baud);
    重新设置波特率;
    
    int available(void);
    返回接收缓存可读取字节数;
    
    int availableForWrite(void);
    ESP32默认有128字节的硬件TX FIFO,该方法返回TX FIFO空闲字节数;
    
    int peek(void);
    返回接收缓存中第一个字节数据,但并不从中删除它;
    
    int read(void);
    返回接收缓存中第一个字节数据,读取过的数据将从接收缓存中清除;
    
    void flush(void);
    等待串口收发完毕;
    
    size_t write(uint8_t);
    写数据到TX FIFO,在发送FIFO中的数据会自动输出到TX端口上;
    该方法有很多重载,可以用来发送字符串、长整型、整形;
    如果TX FIFO已满,则该方法将阻塞;
    
    size_t write(const uint8_t *buffer, size_t size);
    写数据到TX FIFO,如果发送FIFO已满,则该方法将阻塞;
    
    uint32_t baudRate();
    返回当前串口波特率;
    
    size_t setRxBufferSize(size_t);
    设置接收缓存大小(默认为256字节);
    ESP32默认有128字节的硬件RX FIFO,在RX FIFO收到数据后会移送到上面的接收缓存中;
    
    
    

    三、总结

    开发板的技术说明书很重要,有时候在实际操作过程中遇到的问题,可以从技术手册中找到。

    展开全文
  • 串口初始化以及开启接收之后,在串口悬空状态下很容易出现FE帧错误,但是HAL对于错误的处理会造成程序陷入死循环,不断进入接收中断。 FE的解释如下: FE: 帧错误 当一个不同步现象、 强噪声或一个断开符号被...
  • CC2530--串口实验的回显

    千次阅读 2014-01-10 17:25:41
    1.串口收发要初始化串口,(设置时钟频率-->选择用来当做串口的IO-->设置波特率-->发送中断设为0-->打开数据接收的中断) 2.字符串发送函数(U0DBUF填充字符-->等待串口发送完毕-->发送中断标志设为0,准备下次发送...
  • //初始化串口 void InitUart() { //配置I/O,使用外部设备功能 PERCFG=0x00; //外设控制 P0SEL=0x0C; //配置P0端口的2,3为外设 //配置相应的串口 P2DIR&=~0x40; //优先级的控制 U0CSR|=0x80; //...
  • UBOOT目录解释(一)

    千次阅读 2015-08-07 20:25:41
    uboot是bootloader,翻译为引导程序,也可以称之为启动代码,类似于PC机的BIOS一样。 我们常用的51单片机,也是有bootloader的哦,只是厂家给你写好了...它不但完成了初始化功能,还带了,像串口、USB、网口、文件系统
  • XSBase255 -linux 启动过程描述linux启动过程一.BootLoader 功能简单描述,屏蔽所有中断,初始化GPIO,初始化SDRAM,拷贝BootLoader到SDRAM中,加载内核映像文件,跳转到C程序初始化串口初始化以太网,等待...
  • 关于硬件的初始化: 上电后各寄存器都会有一个默认值,这个默认值由硬件的设计人员决定;CPU的工作模式、板载硬件资源如IO、网络、磁盘读写、串口通信等的配置都由这些寄存器决定,上电后可以通过程序对这些寄存器...
  •  关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
  • 机FLASH盘上,由Vxld或其他程序加载到内存,用于初始化目标机上的包括引导硬件在内 的 硬件,建立VxWorks运行的环境,从引导设备上加载VxWorks操作系统影像,并将CPU的控 制 权移交给操作系统。 VxWorks是操作...
  • RED HAT LINUX 6大全

    热门讨论 2011-10-21 18:46:06
    6.2 初始化进程和启动脚本 90 6.2.1 init和/etc/inittab 90 6.2.2 /etc/inittab和系统状态 92 6.3 linuxconf与管理服务 96 6.4 关闭Linux系统 98 6.4.1 shutdown 98 6.4.2 halt与reboot 99 6.5 当系统崩溃时 100 ...
  • 8.11 简化数据结构的初始化过程 274 8.12 定义一个接口或抽象基类 278 8.13 实现一种数据模型或类型系统 281 8.14 实现自定义的容器 287 8.15 委托属性的访问 291 8.16 在类中定义多个构造函数 296 8.17 不通过调用...
  • 实例052 写入与读取串口加密狗 实例053 使用U口加密锁进行身份验证 实例054 利用短信猫发送与接收手机短信息 实例055 远程获取客户端网卡地址 实例056 使用IC卡制作考勤程序 实例057 条形码扫描器销售商品 ...
  • 3、借用bma250.c这个驱动程序初始化的部分修改为初始化bmi160,调通BMI160的gsensor部分。 4、完善全志/博世提供的bmi160的驱动程序,调通BMI160的gsensor部分。 (陀螺仪部分鱼刺类似,陀螺仪部分借用l3gd20.c来...

空空如也

空空如也

1
收藏数 20
精华内容 8
关键字:

串口初始化程序解释