精华内容
下载资源
问答
  • DELPHI串口编程

    2015-12-10 21:39:48
    差异,接口通常由一些寄存器或RAM芯片组成,如果芯片足够大还可以实现批量数据的传输; 2)能够进行信息格式的转换,例如串行和并行的转换; 3)能够协调CPU和外设两者在信息的类型和电平的差异,如电平 转换驱动...
  • [3]SWM181-使用串口

    2020-03-22 18:00:57
    翻查数据手册,发现并没有特定的串口引脚,芯片内部有一个神奇的数字信号引脚分配器——>PORTCON。 对于部分数字输入输出功能,可以配置到任意 I/O 引脚,以方便板级布局。包括如下功能:  UARTn_TX  UARTn_...

    尝试使用串口通讯进行通讯,我在原理图上面怎么找都找不到串口引脚。
    翻查数据手册,发现并没有特定的串口引脚,芯片内部有一个神奇的数字信号引脚分配器——>PORTCON。
    对于部分数字输入输出功能,可以配置到任意 I/O 引脚,以方便板级布局。包括如下功能:
     UARTn_TX           UARTn_RX
     I2Cn_SDA           I2Cn_CLK
     PWMx_OUT         PWM_BREAK
     COUNTERn_IN     CAPTURE_IN
     CAN_RX              CAN_TX
    怎么用呢?我们看看下面这个图应该就明白了。
    FluxBB bbcode 测试
    意思是可用把上面列出来的数字类型引脚分配到任意的带FUNCTION功能的引脚上面。
    那我们看看那些引脚是带有FUNCTION的呢?上图:

    看起来,除了电源引脚、晶振引脚、复位引脚,其余的引脚都支持配置为FUNCTION功能。
    怎么配置呢?我们尽量不要关注寄存器层,直接使用官方的例程上面的库接口:
        PORT_Init(PORTA, PIN0, FUNMUX_UART0_RXD, 1);    //GPIOA.0配置为UART0输入引脚
        PORT_Init(PORTA, PIN1, FUNMUX_UART0_TXD, 0);    //GPIOA.1配置为UART0输出引脚
    来到这里,终于明白为什么开发板上面CH340G的两根串口线不直连MCU了。
    初始化串口,使用官方的代码,略微修改波特率为115200。

    void SerialInit(void)
    {
    	UART_InitStructure UART_initStruct;
    	
    	PORT_Init(PORTA, PIN0, FUNMUX_UART0_RXD, 1);	//GPIOA.0配置为UART0输入引脚
    	PORT_Init(PORTA, PIN1, FUNMUX_UART0_TXD, 0);	//GPIOA.1配置为UART0输出引脚
     	
     	UART_initStruct.Baudrate = 115200;
    	UART_initStruct.DataBits = UART_DATA_8BIT;
    	UART_initStruct.Parity = UART_PARITY_NONE;
    	UART_initStruct.StopBits = UART_STOP_1BIT;
    	UART_initStruct.RXThreshold = 3;
    	UART_initStruct.RXThresholdIEn = 0;
    	UART_initStruct.TXThreshold = 3;
    	UART_initStruct.TXThresholdIEn = 0;
    	UART_initStruct.TimeoutTime = 10;
    	UART_initStruct.TimeoutIEn = 0;
     	UART_Init(UART0, &UART_initStruct);
    	UART_Open(UART0);
    }

      重定位编译器C库的标准输出:

    int fputc(int ch, FILE *f)
    {
    	UART_WriteByte(UART0, ch);
    	
    	while(UART_IsTXBusy(UART0));
     	
    	return ch;
    }

    这样就能够愉快的使用printf(...)函数进行格式化打印数据了。
    -----------------------------------------------------------------------------------------
    直接把MCU串口引脚连接到CH340G的串口引脚上,不知道会不会烧掉
    PA0(RX)-->TX
    PA1(TX)-->RX

    -----------------------------------------------------------------------------------------

    刚刚想用keil直接下载程序,便按官方教程,修改Jflash中的相关文件,但是keil还是无法下载,还是要使用官方的Jlink下载软件。
    写好串口的程序,下载进去。
    芯片没有任何反应。下载之前的点灯程序,按下按键,依然没有任何反应。
    芯片似乎挂掉了,可能是由以下原因导致,
    ①按照官方的教程中修改Jlink的Device.xml文件(重装Jlink,没有解决问题,排除!)
    ②CH340G IO无法直连MCU IO导致芯片不正常,
    ③使用了下载软件的校验功能,虽然没有成功过,可能影响了内部的数据
    ④使用keil下载,虽然下载失败,可能影响了内部的数据
    反正现在情况就是显示下载成功,但是没有出现想要的实验现象,具体原因未知。

    FluxBB bbcode 测试
    使用下载软件的校验功能,校验结果说不一致,到底是什么原因呢?
    FluxBB bbcode 测试

    =======================================================================

    解决方案:

    下载https://whycan.cn/files/members/1390/Synwit_JFLASH-190304.rar的内容,解压后,复制到./Keil/ARM/Flash中,然后直接使用Keil下载程序,下载之前的点灯程序,成功点灯。目录如下:
    FluxBB bbcode 测试

    -----------------------------------------------------------------------------------------

    程序下载进去之后,串口调试助手上面没有任何数据,将2根线反过来,可用看到数据,说明上面这个接法是错的,应该修正为:
    PA0(RX)-->RX
    PA1(TX)-->TX
    (此接法对应开发板上面的丝印,并非是芯片引脚的标识)

    展开全文
  • UART串口驱动代码编写及总结

    千次阅读 2019-10-23 18:09:16
    芯片内置UART接口,用于与外部进行异步串行通信。串口控制器有如下特征:...-每个UART口,芯片分配16K的地址。每个UART相关的寄存器如下图: 寄存器名称 作用 uart_ctl uart控制寄存器 u...

    芯片内置UART接口,用于与外部进行异步串行通信。串口控制器有如下特征:1,内置波特率发生器,支持不同波特率的配置;2,数据位宽支持5/7/8bit;3 停止位可配置成1或2bit;4,可支持38Khz红外调制;5 , 支持自动波特率检测。

    -每个UART口,芯片会分配16K的地址。每个UART相关的寄存器如下图:

    寄存器名称 作用
    uart_ctl uart控制寄存器
    uart_baud uart波特率配置寄存器
    uart_txd uart发送数据寄存器
    uart_rxd uart接收数据寄存器

    UART_CTRL寄存器的每个位的具体作用如下图:

    uart_ctl 寄存器bit位 具体bit位作用
    bit0(EN) 置1时模块使能
    bit1(TXIN) 置1时发送中断使能, 对应的是sta状态寄存器中的bit0)
    bit2(RXIN) 置1时接收数据中断使能,对应sta状态寄存器中的bit1
    bit3(ERRIN) 置1时,打开错误中断使能,对应sta状态寄存器的bit2-bit5
    bit4(STOPS) 置1时,设置为2bit的停止位;置0时,表示1bit的停止位
    bit6-5(data_translen) 控制数据传输时的bit位; 00: 5bit;01: 6bit;10:7bit;11:8bit
    bit9-7(pars数据校验) 000: 无校验;001:奇校验;010:偶校验;011:固定为0校验;100:固定为1校验

    编写UART串口驱动程序时,需要从以下几个方面进行考虑。

    1. 串口时钟使能,GPIO时钟使能;
    2. 串口复位;
    3. GPIO端口模式配置;
    4. 串口参数初始化
    5. 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤);
    6. 使能串口;
    7. 编写中断处理函数。
    //UART_rx口模式寄存器通过bitband映射到的地址
    //UART_rx口数据寄存器通过bitband映射到的地址
    //UART_tx口模式寄存器通过bitband映射到的地址
    //UART_tx口数据寄存器通过bitband映射到的地址
    #include <stdio.h>
    #define  UART_rxgpio_mode  0x50000000     
    #define  UART_rxgpio_data  0x50000004     
    #define  UART_txgpio_mode  0x50000008     
    #define  UART_txgpio_data  0x5000000C     
    #define  UART_rstgpio_mode 0x50000012     
    #define  UART_rstgpio_data 0x50000016
    //适合所有GPIO口的通用的数据结构
    #define	 uart_num          3//设备中uart通道的总个数是3个。
    
    	struct gpio_t
    	{
    		int *gpio_data_out;//gpio数据寄存器,用来输出数据
    		int *gpio_data_in;//gpio数据寄存器,用来输入数据
    		int *gpio_mode;    //gpio模式寄存器,用来控制io口是输入还是输出的。
    		void (*out_mode)       (int *gpio_mode);				  //gpio配置为输出模式
    		void (*in_mode)        (int *gpio_mode);					  //gpio配置为输入模式
    		void (*active_signal)  (int *gpio_data_out);		  //gpio的数据寄存器中,某一位输出有效位(打开功能)
    		void (*non_active_signal)  (int *gpio_data_out);    //gpio的数据寄存器中,某一位输出无效位(关闭功能)
    	};
    
    	void out_mode (int *gpio_mode)
    	{
    		*gpio_mode = 1;//输入模式
    	}
    
    	void in_mode  (int *gpio_mode)
    	{
    		*gpio_mode = 1;//输入模式
    	}
    	void active_signal (int *gpio_data_out)
    	{
    		*gpio_data_out = 1;//这个要根据实际情况,看高电平有效还是低电平有效
    	}
    
    	void non_active_signal (int *gpio_data_out)
    	{
    		*gpio_data_out = 0;//这个要根据实际情况,看高电平有效还是低电平有效
    	}
    //一个UART口至少要包括TX和Rx,对于外设寄存器,芯片厂家一般会给出bitband,对数据和模式寄存器的地址进行映射到另外一片内存区域,进行位操作
    	struct gpio_t  rx =
    	{
    		(int *)UART_rxgpio_data, //gpio通过bitband映射到的地址
    		(int *)UART_rxgpio_data, //gpio通过bitband映射到的地址
    	    (int *)UART_rxgpio_mode,
    		out_mode,
    		in_mode,
    		active_signal,
    		non_active_signal,
    	};//uart的接收io口
    
    	struct gpio_t  tx = 
    	{
    		(int *)UART_txgpio_data, //gpio通过bitband映射到的地址
    		(int *)UART_txgpio_data, //gpio通过bitband映射到的地址
    		(int *)UART_txgpio_mode,
    		out_mode,
    		in_mode,
    		active_signal,
    		non_active_signal,
    	};  //uart的发送io口
    
    	struct gpio_t  rst =
    	{
    		(int *)UART_rstgpio_data,   //gpio通过bitband映射到的地址
    		(int *)UART_rstgpio_data,   //gpio通过bitband映射到的地址
    		(int *)UART_rstgpio_mode,
    		out_mode,
    		in_mode,
    		active_signal,
    		non_active_signal,
    	};  //uart的复位的io口
    //对uart进行数据结构的定义
    	struct uart_t
    	{
    		char     *name;//分清是哪个串口
    		struct   gpio_t  *rx;
    		struct   gpio_t  *tx;
    		struct   gpio_t  *rst;
    	};
    	struct uart_t  remote_uart = 
    	{
    		"remote_uart",
    		(int *)&rx,
    		(int *)&tx,
    		(int *)&rst,
    	};
        //串口相关的配置
    	struct uart_config_t
    	{
    		int baud_rate;  //波特率的配置
    		int data_bits;  //数据位
    		int parity;     //奇偶校验位
    		int stop_bits;  //停止位
    		int data_process_mode;//数据处理的方式,分为扫描和中断
    	};
    
    	enum  data_process_mode 
    	{
    		scan_mode  = 0,//扫描的方式
    		invt_mode  //中断的方式
    	};
    
    	struct uart_config_t uart_config = 
    	{
    		9600,
    		8,//8位数据位
    		0,//无校验
    		1,//1位停止位
    		invt_mode,//中断的方式
    	};
    	 
    	//芯片内部总的全局变量,用来控制各个外设工作的。
    	struct sys_t
    	{
    		int  osc_ctl1;//系统OSC控制寄存器
    		int  sys_mode;//系统模式切换寄存器
    		int  sys_pd;  //系统掉电控制寄存器
    		int  ADC_CTL; //ADC控制寄存器(电源控制)
    		int  osc_ctl2;//系统osc2控制寄存器
    		int  sys_rst; //系统复位寄存器
    		int  map_ctl; //地址映射控制寄存器
    		int  mode0_en;//模块使能0寄出器
    		int  mode1_en;//模块使能1寄存器
    		int  nvic_en; //nvic中断使能寄存器
    		int  kbi_en;  //kbi使能寄存器
    	}; 
    	
    	struct sys_t sys;
    
    	struct uart_t_paramete_config_t
    	{
    		int ctrl;//控制寄存器
    		int baud;//波特率配置寄存器
    		int stat;//uart相关的状态寄存器
    		int txd;//发送数据寄存器
    		int rxd;//接收数据的寄存器
    	};
    	struct uart_t_paramete_config_t uart;
    
    	//串口的状态
    	struct uart_status_t
    	{
    		int reset_time_count;//达到这个固定的时间,就复位一下串口。防止串口彻底乱了
    		int tx_time_out;//每次发送完时间的延时,超过这个时间,才允许再次发送
    		int rx_time_out;//每次接收数据的时间延时计时。两帧之间只有大于这个时间,才允许继续读出来
    	};
    	struct uart_status_t uart_status[uart_num];
    
    	struct fifo_t
    	{
    		int *fifo_buf;//uart串口通信的起始地址
    		int rd; //读的指针
    		int wd; //写的指针
    		int buf_len;//uart串口总的数据长度
    	};
    
    	struct resource_driver_t;//编译这个参数时,会自动往下查找的。
    	struct device_t
    	{
    		int device_id;//器件对应的id
    		int trans_class;//总线传输类型:IIC,SPI,Uart
    		void *bus_driver;//总线驱动(万能的void*,后面进行实例化时,可以进行强转)
    		void *resource; //实际占用的硬件资源(IO等)
    		void *resource_cfg;//硬件资源的配置:如控制灯如何闪烁间隔等
    		struct resource_driver_t *resouce_driver;//器件资源控制驱动(初始化,读,写,控制的驱动)
    	};
    
    	//设备驱动的初始化,读,写,执行功能,需要用函数指针进行实例化
    	struct resource_driver_t
    	{
    		int (init*)(struct device_t *device,int mode);//根据上电,下电,复位等情况时,对资源进行初始化操作
    		int (*read)(int addr, int *buf, int len, struct device_t *device);//根据资源实际挂载的传输总线。进行查找里面的值
    		int (*write)(int addr, int *buf, int len, struct device_t *device);
    		int(*ioctrl)(int ctlid, struct device_t *device, int parameter);//根据传进来的参数进行实际控制设备
    
    	};
    
    	struct uart_buffer_t
    	{
    		struct fifo_t rx;//接收的缓存
    		struct fifo_t tx;//发送数据的缓存
    		struct device_t *device;//uart实际物理设备的地址
    	};
    	struct uart_buffer_t uart_buf[uart_num];
    
    	void nvic_disable(int uart_nvic_index)
    	{
    
    	}
    	void nvic_enable(int uart_nvic_index)
    	{
    
    	}
    	void uart_init  (struct uart_config_t *uart_config, struct uart_t  *remote_uart)
    	{
    		//在芯片的上配置对应的时钟使能
    		sys.mode0_en |= 1 << 5;    //使能远程通信串口的时钟
    		//会根据配置的串口的数据位和校验位信息,进行改变ctrl里面寄存器的值
    		if (uart_config->data_bits == 8)
    		{
    			uart.ctrl |= (uart_config->data_bits - 5) << 5;//将ctrl的bit5,6进行置位。
    		}
    
    		uart.baud = uart_config->baud_rate; //暂时用这个方法,实际上比这个复杂,具体根据芯片厂家来确定
    		//根据配置的uart数据是扫描还是中断的方式,来确定系统的中断是否生效
    		if (uart_config->data_process_mode == scan_mode) //配置为扫描的方式,则uart对应的系统中断失效
    		{
    			nvic_disable(0); //远程uart中断号失效,不在使用
    		}
    		else
    		{
    			nvic_enable(0);//将uart口的中断号生效
    		}
    	}
    
    	int main()
    	{
    		struct gpio_t *txio = remote_uart.tx;
    		struct gpio_t *rst  = remote_uart.rst;
    		memset(sys,0);
    		//uart的初始化,是在通信模块上电瞬间进行初始化的:根据实际的uart通道的个数,分别对每个uart进行初始化操作
    		//1.首先uart底层驱动的buffer指向应用层实际的串口。
    
     //上电时,先设定好io口是输入还是输出的模式。输出模式时,模式寄存器对应的bit位为0;输入模式时,模式寄存器上对应的bit位为1
    		remote_uart.tx->out_mode(txio->gpio_mode);//将rx配置为输出模式,由于电脑上0x50000008这个内存不能分配给使用,故会报错。嵌入式硬件上可以
    		remote_uart.tx->out_mode(rst->gpio_mode);//将rst管脚配置为输出模式
    
    		//根据配置好的uart相关io配置及串口通信相关的配置,对串口进行初始化。主要功能:修改UART相关寄存器里面的值
    		uart_init(&uart_config, &remote_uart);
    		//上电过程中通过文件系统,进行读,写,控制串口通信
    
    		system("pause");
    	}
    
    
    
    展开全文
  • 在Pinout中时钟配置为高速外部时钟UART配置为异步通信cube会自动分配引脚 Clock Configuration中配置如下 configuration中点击USART1可进入配置 在USART1 configuration 中Parameter Settings可以配置波特率发送数据...
  • //设置串口波特率 数据位校验位 aw_serial_ioctl(TEST_SERIAL_NUM, SIO_BAUD_SET, (void *)115200); aw_serial_ioctl(TEST_SERIAL_NUM, SIO_HW_OPTS_SET, (void *)(CS8 | CLOCAL | CREAD)); //设置串口接收...
  • 为什么不能使用串口发送中断?

    千次阅读 2011-04-16 23:18:00
       最近我设计了一块板子,选用的主芯片是C8051F020,外围的USB芯片是PDIUSBD12,在调试的时候需要用串口打印调试信息。由于UART0被分配和GPS通讯,因此只能用UART1来打印调试信息。  调试UART0...

     

         最近我设计了一块板子,选用的主芯片是C8051F020,外围的USB芯片是PDIUSBD12,在调试的时候需要用串口打印调试信息。由于UART0被分配和GPS通讯,因此只能用UART1来打印调试信息。

          调试UART0倒是很顺利,利用中断来发送和接收数据;而在调试UART1的时候却发现不能用中断来发送数据。虽说代码是用汇编写的,可是不应该一个能行,一个不能行的。这些代码以前也用过,而且证明了是OK的(当时的板卡是别人设计的,不过用的也是C8051F020),为什么呢?

          该设置的都已经设置了,虽说用查询的方式也能完成工作,可是我还是有些不明白。

          希望有高人指点一二!

    展开全文
  •  昨天在用FBS200 指纹采集芯片采集到一个二维数组数据后,利用串口传输上来的数据是以十六进制的数据格式表示的二维矩阵,比如“FF” 、“BD” 、“5C ”等等这样的形式,而对于一幅灰度图像,一般都是在0 ~...

    二维字符串数组的初始化-动态内存分配

    http://blog.csdn.net/gangwazi0525/article/details/5960839

         昨天在用FBS200 指纹采集芯片采集到一个二维数组数据后,利用串口传输上来的数据是以十六进制的数据格式表示的二维矩阵,比如“FF” 、“BD” 、“5C ”等等这样的形式,而对于一幅灰度图像,一般都是在0 ~255 之间的数据来表示其亮度值,因此想通过二维字符串数组来对采集过来的数据进行转化显示。 但在动态分配一个 char **str  str  new char*[128] ;之后对其进行初始化时,总是出现错误,不知道如何才能很好的对其赋值,还得深入学习一下。

    其实对一个字符的转化很容易,但对一个字符串形式的字符来转化,而且是对一个多维数组来转化就有点吃力了。首先建立一个多维字符串数组,这里是二维的字符串数组,程序如下所示:

    #i nclude "stdio.h"

    void main()

    {

         char *str1[2][2] ={"FF","F9","FA","F9"};// 初始化一个二维字符串数组

         char *str;// 定义一个一维字符串变量

         int a,b;

         int i,j;

         int result1;

         for (i=0;i<2;i++)

         {

             for (j=0;j<2;j++)

             {

                  str=str1[i][j];// 对一维字符串赋值

                  printf("%s/n",str);

                  if(str[0]>='A' && str[1]>='A')

                  {

                       a=int(str[0]-'A');

                       b=int(str[1]-'A');

                       result1=(a+10)*16+(b+10)*1; // “AA” ~“FF ”之间的转化结果

                  }

                  else if (str[0]>='A' && str[1]<'A')

                  {

                       a=int(str[0]-'A');

                       b='A'-str[1]+1;

                       result1=(a+10)*16+b; // “A0” ~“F9” 之间的转化结果

                  }

                  else if (str[0]<'A' && str[1]>='A')

                  {

                       a='A'-str[0]+1;

                       b=int(str[1]-'A');

                       result1=a*16+(b+10)*1; // “0A ” ~“9F ” 之间的转化结果

                  }

                  else

                  {

                       a='A'-str[0]+1;

                      b='A'-str[1]+1;

                       result1=a*16+b; // “00” ~“99 ”之间的转化结果     

                  }

                  printf("a=%d/n",a);

                  printf("b=%d/n",b);

                  printf("%d/n",result1);    

             }

         }

    }

    这里只是用2 ×2 的字符串数组做了一个实验,一幅图像都是比较大的,这样在对数组初始化时会占用很多的内存,这样有时会造成编译无法通过,昨天就很有几次死机,当时只是用到64 ×64 的数组。后来把数组的初始化放到main 的外面,作为全局变量,在栈中静态的分配一块内存空间,虽然可行,但也很占内存,于是想到了在函数中动态分配内存,对动态分配内存又重新学习了一遍,不了解的可以和我一起学习一下。

    动态内存分配

    1. 堆内存分配 

    C/C++ 定义了4 个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap )区或自由存储区(free store )。

    堆的概念:

    通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;

        有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。

    当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。

     

    2. 堆内存的分配与释放

    堆空间申请、释放的方法:

    在C++ 中,申请和释放堆中分配的存贮空间,分别使用new 和delete 的两个运算符来完成:    指针变量名=new 类型名( 初始化式) ;

             delete 指针名;

    例如:1 、 int *pi=new int(0);

          它与下列代码序列大体等价:

          2 、int ival=0, *pi=&ival;

    区别:pi 所指向的变量是由库操作符new() 分配的,位于程序的堆区中,并且该对象未命名。  

    堆空间申请、释放说明:

    ⑴.new 运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而且动态创建的对象本身没有名字。

    ⑵. 一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象( 请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的) 。

    ⑶. 堆区是不会在分配时做自动初始化的(包括清零),所以必须用初始化式(initializer) 来显式初始化。new 表达式的操作序列如下:从堆区分配对象,然后用括号中的值初始化该对象。

     

    3. 堆空间申请、释放演示:

    ⑴. 用初始化式(initializer) 来显式初始化

    int *pi=new int(0);

    ⑵. 当pi 生命周期结束时,必须释放pi 所指向的目标:

             delete pi;

    注意这时释放了pi 所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(dynamic memory deallocation ),但指针pi 本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。

    下面是关于new 操作的说明

    ⑴.new 运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。 
       ⑵. 一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象( 请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的) 。

    ⑶. 堆区是不会在分配时做自动初始化的(包括清零),所以必须用初始化式(initializer) 来显式初始化。new 表达式的操作序列如下:从堆区分配对象,然后用括号中的值初始化该对象。

     
    4. 
    在堆中建立动态一维数组

    ①申请数组空间:

    指针变量名=new 类型名[ 下标表达式];

    注意:“ 下标表达式” 不是常量表达式,即它的值不必在编译时确定,可以在运行时确定。

    ②释放数组空间:

    delete [ ] 指向该数组的指针变量名;

    注意:方括号非常重要的,如果delete 语句中少了方括号,因编译器认为该指针是指向数组第一个元素的,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。delete [ ] 的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。

    #i nclude <iostream.h>

    #i nclude <string.h>

    void main(){

         int n;

         char *pc;

         cout<<" 请输入动态数组的元素个数"<<endl;

         cin>>n; //n 在运行时确定,可输入17

         pc=new char[n]; // 申请17 个字符(可装8 个汉字和一个结束符)的内存空间

         strcpy(pc,“ 堆内存的动态分配”);//

         cout<<pc<<endl;

         delete []pc;// 释放pc 所指向的n 个字符的内存空间

         return ;  }

     

    5. 动态一维数组的说明

    ① 变量n 在编译时没有确定的值,而是在运行中输入,按运行时所需分配堆空间,这一点是动态分配的优点,可克服数组“ 大开小用” 的弊端,在表、排序与查找中的算法,若用动态数组,通用性更佳。一定注意:delete []pc 是将n 个字符的空间释放,而用delete pc 则只释放了一个字符的空间;

    ② 如果有一个char *pc1 ,令pc1=p ,同样可用delete [] pc1 来释放该空间。尽管C++ 不对数组作边界检查,但在堆空间分配时,对数组分配空间大小是纪录在案的。

    ③ 没有初始化式(initializer ),不可对数组初始化。


    6.
     指针数组和数组指针

    指针类型:

    (1)int*ptr;// 指针所指向的类型是int 
    (2)char*ptr;//
     指针所指向的的类型是char 
    (3)int**ptr;// 指针所指向的的类型是int* (也就是一个int * 型指针) 
    (4)int(*ptr)[3];// 指针所指向的的类型是int()[3] // 二维指针的声明

    指针数组:

    一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。

    比如 int * a[2]; 它里边放了2 个int * 型变量 .

    int * a[2] ; 
    a[0]= new int[3]; 
    a[1]=new int[3]; 
    delete a[0]; 
    delete a[1];

    注意这里 是一个数组,不能delete [] ;

     

    数组指针:

      一个指向一维或者多维数组的指针.

    int * b=new int[10];  指向一维数组的指针b ; 
    注意,这个时候释放空间一定要delete [] , 否则会造成内存泄露, b 就成为了空悬指针

    int (*b2)[10]=new int[10][10]; 注意,这里的b2 指向了一个二维int 型数组的首地址. 
    注意:在这里,b2 等效于二维数组名,但没有指出其边界,即最高维的元素数量,但是它的最低维数的元素数量必须要指定!就像指向字符的指针,即等效一个字符串, 不要把指向字符的指针说成指向字符串的指针。

    int(*b3) [30] [20];  // 三级指针――> 指向三维数组的指针; 
    int (*b2) [20];     // 二级指针;――> 指向二维数组的指针; 
    b3=new int [1] [20] [30]; 
    b2=new int [30] [20]; 
    删除这两个动态数组可用下式: 
    delete [] b3;  // 删除(释放)三维数组; 
    delete [] b2;  // 删除(释放)二维数组;

    在堆中建立动态多维数组

    new 类型名[ 下标表达式1] [ 下标表达式2]……;

    例如:建立一个动态三维数组

    float (*cp)[30][20] ;  // 指向一个30 行20 列数组

                                 // 的指针,指向二维数组的指针

    cp=new float [15] [30] [20];

          // 建立由15 个30*20 数组组成的数组;

    注意:cp等效于三维数组名,但没有指出其边界,即最高维的元素数量,就像指向字符的指针即等效一个字符串,不要把指向字符的指针,说成指向字符串的指针。这与数组的嵌套定义相一致。

    展开全文
  • 由Verilog HDL语言编程实现软件架构,直接使用FPGA编程实现数据的多通道分配和磁盘阵列控制,分时处理A/D芯片采集到的高速率大容系量数据,再由串并转换芯片将目标数据存入串口SATA硬盘。实验结果表明,在150 MHZ的...
  •  昨天在用FBS200 指纹采集芯片采集到一个二维数组数据后,利用串口传输上来的数据是以十六进制的数据格式表示的二维矩阵,比如“FF” 、“BD” 、“5C ”等等这样的形式,而对于一幅灰度图像,一般都是在0 ~255 ...
  • 实验四 串口打印实验 14 引脚分配 14 实验原理 14 函数简介 14 实验步骤 14 实验五 定时器控制 16 引脚分配 16 实验原理 16 函数简介 17 实验步骤 17 实验六 AD转化实验 18 引脚分配 18 实验原理 18 函数简介 18 ...
  • 6、音频数据按文件夹排序,最多支持 100 个文件夹,每隔文件夹可以分配 1000 首歌曲; 7、30 级音量可调,10 级 EQ 可调; 8、可以外挂 spiflash,连接电脑可以显示 spiflash 的盘符进行更新内容; 9、可以通过...
  • 3.4基于UART的加法器的实现 一、实验目的 学习lm3s9b92的串口通信 学习应用超级终端调试串口 学会应用UART有关的库函数 二、实验设备 计算机、LM3S9B92开发板、USB A型公口转 Mini B型 5Pin 数据线1 条 ...
  • 机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。 固态硬盘是用固态电子存储芯片阵列而制成的硬盘。 IDE为并口 /dev/hdv /dev/hde STAT为...
  • BLU232采用高性能低功耗蓝牙无线通信芯片,内置高性能微处理器实现串口数据的传输,可广泛应用于各种场合的短距离无线通信、工业控制领域。产品本身可将自己的串口接到计算机后用串口调试助手程序进行通信速率、格式...
  • 甚至用串口工具rts重启都是好的,就是断电重启后,或者软件重启后,程序跑飞了(几个全局变量数据异常)。 解决方式: 1、检测是否内存溢出,导致程序跑飞; 2、检测EPRom,是否存储是否正确,比如char...
  • 3.6串口芯片驱动安装 3.6.1驱动安装 3.6.2设备识别 3.7USB 3.0控制器FX3的SDK安装 3.8USB 3.0控制器FX3的驱动安装 Altera FPGA伴你玩转USB 3.0与LVDS 第4章第一个例程与FPGA下载配置概述 4.1LED闪烁与...
  • 5.1.1 存储地址空间分配 5.1.2 i/o口配置 5.1.3 电源、时钟及复位电路 5.1.4 mbl(micetek boot loader)介绍 5.2 存储器电路设计及编程 5.2.1 bootflash电路及编程 5.2.2 sdram电路设计及编程 ...
  • 维修实践中发现,手机的软件绝大多数出在码片,并多数是芯片中的数据丢失或出错 4•2•2 处理故障技巧 手机出现软件故障,有免拆机和拆机两种方式进行处理,下面介绍两种方式的特点。免拆机方式就是借助专门的软件...
  • ldr r1, =0x7ff /*根据 2410 芯片手册,INTSUBMSK 有 11位可用 */ ldr r0, =INTSUBMSK Create PDF files without this message by purchasing novaPDF printer (http://www.novapdf.com) str r1, [r0] # endif ...
  • 阿波罗stm32f767开发板

    2018-07-05 15:09:49
    | |--2,芯片资料------------------------------------------阿波罗F767开发板板载各芯片数据手册 | |--3,液晶资料------------------------------------------ALIENTEK各尺寸液晶驱动IC资料 | |--4,OV5640...
  • 发生周期性变化的信号,因待测信号的不规则,不能直接送入FPGA 芯片中处 理,所以应该首先对待测信号进行放大、降压、与整形等一系列处理。 (2)分频电路 将处理过的信号4 分频,这样可以将频率计的测量范围扩大4 倍...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    要实现单片机与电脑的连接,最简单的方式就是采用串口通讯,但需要加一颗RS-232芯片。 17. 在ARM编程中又应当如何? 答:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微...
  • 复旦nois教材01.rar

    2009-08-05 20:08:37
    3.1.2 数据总线主端口...................................................................................................37 3.1.3 缓冲存储器.................................................................

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

串口数据分配芯片