2020-03-17 16:12:39 weixin_42369496 阅读数 18
  • C#程序设计与宿舍管理系统实战

    为什么要学习C#?C#是微软的王牌语言,拥有接近20年的历史和广泛的应用。目前国内对C#的书籍和视频相对较少,但C#和.NET的发展前程是十分光明的,这体现在微软公司本身强劲的实力,C#的开源,.NET Core社区的蓬勃发展,以及.NET开发岗位需求的不断增加。C#用途广泛,容易上手。可以说,如果你熟悉C#语言,你将不愁找不到好的工作。 本课程详细的讲述了一名C#初级程序员需要掌握的各项知识,其中基础和面向对象是重中之重。课程主要特点: 1. 紧跟C#发展,使用**语言和开发环境版本。 2. 结合应用案例,力求做到深入浅出,明白易懂 通过本课的学习,使学生掌握C#语言的语法知识,理解和掌握面向对象程序设计的思想和方法,能熟练使用Visual Studio集成开发环境编写、调试和测试控制台应用软件、Winform应用软件;运用ADO.NET开发数据库应用程序,具有面向对象程序设计、分析和调试能力。 希望本套课程在你学习C#的过程中,可以对你有所帮助。

    2244 人正在学习 去看看 张晨光

RISCV——I2C软件测试程序

位置:E:\i2c\software

h文件

#ifndef _USER_I2C_H_
#define _USER_I2C_H_
#include "platform.h"
//#include "sys.h"
//#include "../app/ALL_DATA.h"
  //#include "stm32f10x.h"
 // #include "system_stm32f10x.h"
#if 1	//使用IIC硬件
#else	//使用gpio模拟IIC

#define TRUE  0
#define FALSE 1
#define in_put (u8)2
//#define IIC_RCC       RCC_APB2Periph_GPIOB
//#define IIC_GPIO      GPIOB
#define SCL_PIN       D3_SCL//GPIO_Pin_6
#define SDA_PIN       D2_SDA//GPIO_Pin_7

#define SCL_H        GPIO_SET(D3_SCL,1,output)// GPIOB->BSRR = GPIO_Pin_6 /* GPIO_SetBits(GPIOB , GPIO_Pin_10)   */
#define SCL_L        GPIO_SET(D3_SCL,0,output)// GPIOB->BRR  = GPIO_Pin_6 /* GPIO_ResetBits(GPIOB , GPIO_Pin_10) */

#define SDA_H        GPIO_SET(D2_SDA,1,output)// GPIOB->BSRR = GPIO_Pin_7 /* GPIO_SetBits(GPIOB , GPIO_Pin_11)   */
#define SDA_L        GPIO_SET(D2_SDA,0,output) // GPIOB->BRR  = GPIO_Pin_7 /* GPIO_ResetBits(GPIOB , GPIO_Pin_11) */

#define SCL_read      GPIO_SET(D3_SCL,0,in_put)//GPIOB->IDR  & GPIO_Pin_6 /* GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_10) */
#define SDA_read      GPIO_SET(D2_SDA,0,in_put)// GPIOB->IDR  & GPIO_Pin_7 /* GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_11) */

#endif
//0表示写
#define	I2C_Direction_Trans   0
//1表示读
#define	I2C_Direction_Rec      1
/*====================================================================================================*/
/*====================================================================================================*/
//PB6 SCL
//PB7 SDA
//return 0:success   1:failed
extern void IIC_Init(void);
//----------------------------------------------------------------------
extern char IIC_Write_One_Byte(char addr,char reg,char data);
extern char IIC_Read_One_Byte(char addr,char reg);
extern char IIC_Write_Bytes(char addr,char reg,char *data,char len);
extern char IIC_read_Bytes(char addr,char reg,char *data,char len);
//----------------------------------------------------------------------f


/*====================================================================================================*/
/*====================================================================================================*/

#endif

C文件

/******************************aircraft****************************************/
#include "user_i2c.h"
#include "platform.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "plic/plic_driver.h"
#include "encoding.h"
#include <unistd.h>
#include "stdatomic.h"



#define I2C_REG_PRERlo          0x00
#define I2C_REG_PRERhi          0x01
#define I2C_REG_CTR             0X02
#define I2C_REG_TXR             0x03
#define I2C_REG_RXR             0X03
#define I2C_REG_CR              0X04
#define I2C_REG_SR              0X04

#define I2C_CTR_EN              (1 << 7)
#define I2C_CTR_IE              (1 << 6)

#define I2C_CR_STA              (1 << 7)
#define I2C_CR_STO              (1 << 6)
#define I2C_CR_RD               (1 << 5)
#define I2C_CR_WR               (1 << 4)
#define I2C_CR_ACK              (1 << 3)
#define I2C_CR_IACK             (1 << 0)

#define I2C_TXR_WRRD            (1 << 0)//0:write to slave; 1:read from slave;

#define I2C_SR_RXACK            (1 << 7)//0:received; 1:no ack resceived
#define I2C_SR_BUSY             (1 << 6)//0:after 'STOP' detected; 1:after 'START' detected
#define I2C_SR_AL               (1 << 5)
#define I2C_SR_TIP              (1 << 1)//0:transfer complete; 1:transfering
#define I2C_SR_IF               (1 << 0)

/*fileds*/

#define I2C_CTR_ENABLE          1
#define I2C_CTR_DISABLE         0

#define I2C_CTR_INTEN           1
#define I2C_CTR_INTDIS          0

#define I2C_TXR_RFS             1       //read from slave
#define I2C_TXR_WTS             0       //write to slave


//#include "xiic_l.h"
//#include "sys.h"
//#include "perfv_io.h"
#undef SUCCESS
#define SUCCESS 0
#undef FAILED
#define FAILED 1
typedef unsigned char u8;
/******************************************************************************
 * 函数名称: I2c_delay
 * 函数功能: I2c 延时函数
 * 入口参数: 无
 ******************************************************************************/
#define I2c_delay()                   \
    {                                 \
        volatile unsigned char i = 1; \
        while (i)                     \
            i--;                      \
    }
//******************************************************************
//函数名:  GPIO_SET
//作者:    PerfXLab
//日期:    2018-07-04
//功能:    配置蜂鸟的引脚
//输入参数:pin_num:引脚名
//			pin_val:引脚值,1或0
//			pin_model:引脚模式,写input表示输入,写output表示输出
//返回值:  无
//修改记录:无
//******************************************************************
static char GPIO_SET(uint32_t pin_num, uint32_t pin_val, uint32_t pin_model)
{
    if (pin_model == output)
    {
        GPIO_REG(GPIO_OUTPUT_EN) |= (0x01 << pin_num);
        if (pin_val == 1)
        { 
            GPIO_REG(GPIO_OUTPUT_VAL) |= (0x01 << pin_num);
        }
        if (pin_val == 0)
        {
            GPIO_REG(GPIO_OUTPUT_VAL) &= ~(0x01 << pin_num);
        }
    }
    if (pin_model == 2) //input
    {
        GPIO_REG(GPIO_INPUT_EN) |= (0x01 << pin_num);
        // wait_ms(1);
        return (GPIO_REG(GPIO_INPUT_VAL) >> pin_num) & 1;
    }
    return 0xff;
}

#if 1
//使用IIC硬件
/******************************************************************************
 * 函数名称: I2c_Init
 * 函数功能: I2c  GPIO初始化
 * 入口参数:******************************************************************************/
void IIC_Init(void)
{

    //IIC 初始化
    //D2_SDA D3_SCL;
    
//    //配置gpio IOF功能
    GPIO_REG(GPIO_IOF_SEL) &= ~((1 << D2_SDA) | (1 << D3_SCL));
    GPIO_REG(GPIO_IOF_EN) |= ((1 << D2_SDA) | (1 << D3_SCL));
//    //时钟分频    	PRER=总线时钟/((5*scl)- 1)  400khz
    I2C_REG(I2C_REG_PRERlo) = 0xf;
    I2C_REG(I2C_REG_PRERhi) = 0;
//    //使能i2c
    I2C_REG(I2C_REG_CTR) = I2C_CTR_EN;
}

/******************************************************************************
 * 函数名称: I2c_Start
 * 函数功能: I2c  起始信号
 * 入口参数: 无
 ******************************************************************************/
static char I2c_Start(void)
{
    if (I2C_REG(I2C_REG_SR) & I2C_SR_BUSY)
        return FAILED;
    return SUCCESS;
}

/******************************************************************************
 * 函数名称: I2c_Stop
 * 函数功能: I2c  停止信号
 * 入口参数: 无
 ******************************************************************************/
static void I2c_Stop(void)
{
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR | I2C_CR_STO;
}

/******************************************************************************
 * 函数名称: I2c_Ack
 * 函数功能: I2c  产生应答信号
 * 入口参数: 无
 ******************************************************************************/
static void I2c_Ack(void)
{
}

/******************************************************************************
 * 函数名称: I2c_NoAck
 * 函数功能: I2c  产生NAck
 * 入口参数: 无
 ******************************************************************************/
static void I2c_NoAck(void)
{
}

/*******************************************************************************
 *函数名称:	I2c_WaitAck
 *函数功能:	等待应答信号到来
 *返回值:   1,接收应答失败
 *           0,接收应答成功
 *******************************************************************************/
static u8 I2c_WaitAck(void)
{
    I2c_delay();
    I2c_delay();
    I2c_delay();
    I2c_delay();
    I2c_delay();

    if (I2C_REG(I2C_REG_SR) & I2C_SR_RXACK)
    {
        return FAILED;
    }
    return SUCCESS;
}

/******************************************************************************
 * 函数名称: I2c_SendByte
 * 函数功能: I2c  发送一个字节数据
 * 入口参数: byte  发送的数据
 ******************************************************************************/
static void I2c_SendByte(char byte)
{
    I2C_REG(I2C_REG_TXR) = byte;
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR;
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
        ;
}

/******************************************************************************
 * 函数名称: I2c_ReadByte
 * 函数功能: I2c  读取一个字节数据
 * 入口参数: 无
 * 返回值	 读取的数据
 ******************************************************************************/
static char I2c_ReadByte(void)
{
    u8 data;
    I2C_REG(I2C_REG_CR) |= I2C_CR_RD;
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
        ;
    data = I2C_REG(I2C_REG_RXR);
    return data;
}
/*****************************************************************************
 *函数名称:	IIC_Write_One_Byte
 *函数功能:	写入指定设备 指定寄存器一个字节
 *入口参数: addr   目标设备地址
 *		     reg    寄存器地址
 *		     data   要写入的数据
 *返回值:1写入失败,0:写入成功
 *******************************************************************************/
char IIC_Write_One_Byte(char addr, char reg, char data)
{

    printf("IIC_Write_One_Byt\r\n");
    if (I2c_Start() == FAILED)
        return FAILED;
    printf("IIC_Write_One_Bytesdfghjk\r\n");
    I2C_REG(I2C_REG_TXR) = addr;
    I2C_REG(I2C_REG_CR) = I2C_CR_WR | I2C_CR_STA;
    printf("IIC_Write_One_Byte 1 == %x\r\n",I2C_REG(I2C_REG_SR) & I2C_SR_TIP);
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
         ;
   printf("IIC_Write_One_Byte 1 == %x\r\n",I2C_REG(I2C_REG_SR) & I2C_SR_TIP);
    printf("IIC_Write_One_Byte 1\r\n");
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    printf("IIC_Write_One_Byte 2\r\n");
    I2C_REG(I2C_REG_TXR) = reg;
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR;
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
        ;
    I2C_REG(I2C_REG_TXR) = data;
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR;
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
        ;
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR | I2C_CR_STO;
    return SUCCESS;
}

/******************************************************************************
 * 函数名称: IIC_Write_Bytes
 * 函数功能: I2c       向设备的某一个地址写入固定长度的数据
 * 入口参数: addr,     设备地址
 *           reg,     寄存器地址
 *			 len,     数据长度
 *			 *data	   数据指针
 * 返回值	 1
 ******************************************************************************/
char IIC_Write_Bytes(char addr, char reg, char *data, char len)
{
    int i;
    if (I2c_Start() == FAILED)
        return FAILED;
	
    I2C_REG(I2C_REG_TXR) = addr;
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR | I2C_CR_STA;
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
        ;
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
	
	I2C_REG(I2C_REG_TXR) = reg;
    I2C_REG(I2C_REG_CR) |= I2C_CR_WR;
    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)
        ;
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
	
    for (i = 0; i < len; i++)
    {
        I2c_SendByte(data[i]);
        if (I2c_WaitAck() == FAILED)
        {
            I2c_Stop();
            return FAILED;
        }
    }
    I2c_Stop();
    return SUCCESS;
}
/*****************************************************************************
 *函数名称:	IIC_Read_One_Byte
 *函数功能:	读指定设备 指定寄存器一个字节
 *入口参数: addr 目标设备地址
 *		     reg   寄存器地址
 *返回参数:  读出的数据
 *******************************************************************************/
char IIC_Read_One_Byte(char addr, char reg)
{
	u8 data;
	if (I2c_Start() == FAILED)
		   return FAILED;
	I2C_REG(I2C_REG_TXR) = addr;
	I2C_REG(I2C_REG_CR) |= I2C_CR_WR | I2C_CR_STA;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP)   ;
	if (I2c_WaitAck() == FAILED)
	{
	   I2c_Stop();
	   return FAILED;
	}
	I2C_REG(I2C_REG_TXR) = reg;
	I2C_REG(I2C_REG_CR) |= I2C_CR_WR;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP) ;
	if (I2c_WaitAck() == FAILED)
	{
	   I2c_Stop();
	   return FAILED;
	}
	I2C_REG(I2C_REG_TXR) = addr+1;
	I2C_REG(I2C_REG_CR) |= I2C_CR_STA | I2C_CR_WR;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP) ;
	if (I2c_WaitAck() == FAILED)
	{
	   I2c_Stop();
	   return FAILED;
	}
	I2C_REG(I2C_REG_CR) |= I2C_CR_STO | I2C_CR_ACK | I2C_CR_RD;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP);
	data = I2C_REG(I2C_REG_RXR);
	return SUCCESS;
}
/******************************************************************************
 * 函数名称: IIC_read_Bytes
 * 函数功能: I2c       向设备的某一个地址读固定长度的数据
 * 入口参数: addr,     设备地址
 *           reg,     寄存器地址
 *			 len,     数据长度
 *			 *data	   数据指针
 * 返回值	 1
 ******************************************************************************/

char IIC_read_Bytes(char addr, char reg, char *data, char len)
{
	if (I2c_Start() == FAILED)
		   return FAILED;
	I2C_REG(I2C_REG_TXR) = addr;
	I2C_REG(I2C_REG_CR) |= I2C_CR_WR | I2C_CR_STA;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP) ;
	if (I2c_WaitAck() == FAILED)
	{
	   I2c_Stop();
	   return FAILED;
	}
	I2C_REG(I2C_REG_TXR) = reg;
	I2C_REG(I2C_REG_CR) |= I2C_CR_WR;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP) ;
	if (I2c_WaitAck() == FAILED)
	{
	   I2c_Stop();
	   return FAILED;
	}
	I2C_REG(I2C_REG_TXR) = addr+1;
	I2C_REG(I2C_REG_CR) |= I2C_CR_STA | I2C_CR_WR;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP) ;
	if (I2c_WaitAck() == FAILED)
	{
	   I2c_Stop();
	   return FAILED;
	}
    len-=1;
    while(len){
        I2C_REG(I2C_REG_CR) = I2C_CR_RD;
	    while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP) ;
        *data = I2C_REG(I2C_REG_RXR);
        data++;
        len--;
    }
	I2C_REG(I2C_REG_CR) |= I2C_CR_STO | I2C_CR_ACK | I2C_CR_RD;
	while (I2C_REG(I2C_REG_SR) & I2C_SR_TIP);
	*data = I2C_REG(I2C_REG_RXR);
	return SUCCESS;
}

#else //使用gpio模拟IIC

/******************************************************************************
 * 函数名称: I2c_Init
 * 函数功能: I2c  GPIO初始化
 * 入口参数: 无
 ******************************************************************************/
void IIC_Init(void)
{
    GPIO_SET(D2_SDA,0,output);
    GPIO_SET(D3_SCL,0,output);
}

/******************************************************************************
 * 函数名称: I2c_Start
 * 函数功能: I2c  起始信号
 * 入口参数: 无
 ******************************************************************************/
static u8 I2c_Start(void)
{
    SDA_H;
    SCL_H;
    I2c_delay();
    if (!SDA_read)
        return FAILED;
    SDA_L;
    I2c_delay();
    if (SDA_read)
        return FAILED;
    SCL_L;
    I2c_delay();
    return SUCCESS;
}

/******************************************************************************
 * 函数名称: I2c_Stop
 * 函数功能: I2c  停止信号
 * 入口参数: 无
 ******************************************************************************/
static void I2c_Stop(void)
{
    SCL_L;
    I2c_delay();
    SDA_L;
    I2c_delay();
    I2c_delay();
    SCL_H;
    I2c_delay();
    SDA_H;
    I2c_delay();
}

/******************************************************************************
 * 函数名称: I2c_Ack
 * 函数功能: I2c  产生应答信号
 * 入口参数: 无
 ******************************************************************************/
static void I2c_Ack(void)
{
    SCL_L;
    I2c_delay();
    SDA_L;
    I2c_delay();
    SCL_H;
    I2c_delay();
    I2c_delay();
    I2c_delay();
    I2c_delay();
    SCL_L;
    I2c_delay();
}

/******************************************************************************
 * 函数名称: I2c_NoAck
 * 函数功能: I2c  产生NAck
 * 入口参数: 无
 ******************************************************************************/
static void I2c_NoAck(void)
{
    SCL_L;
    I2c_delay();
    SDA_H;
    I2c_delay();
    SCL_H;
    I2c_delay();
    I2c_delay();
    I2c_delay();
    I2c_delay();
    SCL_L;
    I2c_delay();
}

/*******************************************************************************
 *函数名称:	I2c_WaitAck
 *函数功能:	等待应答信号到来
 *返回值:   1,接收应答失败
 *           0,接收应答成功
 *******************************************************************************/
static u8 I2c_WaitAck(void)
{
    SCL_L;
    I2c_delay();
    SDA_H;
    I2c_delay();
    SCL_H;
    I2c_delay();
    I2c_delay();
    I2c_delay();

    if (SDA_read)
    {
        SCL_L;
        return FAILED;
    }
    SCL_L;
    return SUCCESS;
}

/******************************************************************************
 * 函数名称: I2c_SendByte
 * 函数功能: I2c  发送一个字节数据
 * 入口参数: byte  发送的数据
 ******************************************************************************/
static void I2c_SendByte(u8 byte)
{
    u8 i = 8;
    while (i--)
    {
        SCL_L;
        I2c_delay();
        if (byte & 0x80)
            SDA_H;
        else
            SDA_L;
        byte <<= 1;
        I2c_delay();
        SCL_H;
        I2c_delay();
        I2c_delay();
        I2c_delay();
    }
    SCL_L;
}

/******************************************************************************
 * 函数名称: I2c_ReadByte
 * 函数功能: I2c  读取一个字节数据
 * 入口参数: 无
 * 返回值	 读取的数据
 ******************************************************************************/
static u8 I2c_ReadByte(void)
{
    u8 i = 8;
    u8 byte = 0;

    SDA_H;
    while (i--)
    {
        byte <<= 1;
        SCL_L;
        I2c_delay();
        I2c_delay();
        SCL_H;
        I2c_delay();
        I2c_delay();
        I2c_delay();
        if (SDA_read)
        {
            byte |= 0x01;
        }
    }
    SCL_L;
    return byte;
}

/******************************************************************************
 * 函数名称: i2cWriteBuffer
 * 函数功能: I2c       向设备的某一个地址写入固定长度的数据
 * 入口参数: addr,     设备地址
 *           reg,     寄存器地址
 *			 len,     数据长度
 *			 *data	   数据指针
 * 返回值	 1
 ******************************************************************************/
int8 IIC_Write_Bytes(u8 addr, u8 reg, u8 *data, u8 len)
{
    int i;
    if (I2c_Start() == FAILED)
        return FAILED;
    I2c_SendByte(addr);
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    I2c_SendByte(reg);
    I2c_WaitAck();
    for (i = 0; i < len; i++)
    {
        I2c_SendByte(data[i]);
        if (I2c_WaitAck() == FAILED)
        {
            I2c_Stop();
            return FAILED;
        }
    }
    I2c_Stop();
    return SUCCESS;
}
int8 IIC_Read_One_Byte(u8 addr, u8 reg)
{
    u8 recive = 0;
    if (I2c_Start() == FAILED)
        return FAILED;
    I2c_SendByte(addr);
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    I2c_SendByte(reg);
    I2c_WaitAck();
    I2c_Stop();
    I2c_Start();
    I2c_SendByte(addr + 1);
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    recive = I2c_ReadByte();
    I2c_NoAck();
    I2c_Stop();
    return recive;
}

/*****************************************************************************
 *函数名称:	i2cWrite
 *函数功能:	写入指定设备 指定寄存器一个字节
 *入口参数: addr 目标设备地址
 *		     reg   寄存器地址
 *		     data 读出的数据将要存放的地址
 *******************************************************************************/
int8 IIC_Write_One_Byte(u8 addr, u8 reg, u8 data)
{
    // printf("\r1 \n");
    if (I2c_Start() == FAILED)
        return FAILED;
    I2c_SendByte(addr);
    // printf("2 \n");
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    // printf("3\r\n");
    I2c_SendByte(reg);
    I2c_WaitAck();
    I2c_SendByte(data);
    I2c_WaitAck();
    I2c_Stop();
    return SUCCESS;
}

int8 IIC_read_Bytes(u8 addr, u8 reg, u8 *data, u8 len)
{
    if (I2c_Start() == FAILED)
        return FAILED;
    I2c_SendByte(addr);
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    I2c_SendByte(reg);
    I2c_WaitAck();
    I2c_Stop();
    I2c_Start();
    I2c_SendByte(addr + 1);
    if (I2c_WaitAck() == FAILED)
    {
        I2c_Stop();
        return FAILED;
    }
    while (len)
    {
        *data = I2c_ReadByte();
        if (len == 1)
            I2c_NoAck();
        else
            I2c_Ack();
        data++;
        len--;
    }
    I2c_Stop();
    return SUCCESS;
}
#endif


//============================================================================//
//	主函数
//=============================================================================//
int main(int argc, char **argv)
{
while(1)
{
// I2C write
  IIC_Init();
  IIC_Write_One_Byte('a0','01','5a');
  IIC_Write_One_Byte('a0','02','5b');
//I2C read
  IIC_Init();
  IIC_Read_One_Byte('a1','01');
  IIC_Read_One_Byte('a1','02');
}
}
2019-06-11 21:51:48 hhl18 阅读数 333
  • C#程序设计与宿舍管理系统实战

    为什么要学习C#?C#是微软的王牌语言,拥有接近20年的历史和广泛的应用。目前国内对C#的书籍和视频相对较少,但C#和.NET的发展前程是十分光明的,这体现在微软公司本身强劲的实力,C#的开源,.NET Core社区的蓬勃发展,以及.NET开发岗位需求的不断增加。C#用途广泛,容易上手。可以说,如果你熟悉C#语言,你将不愁找不到好的工作。 本课程详细的讲述了一名C#初级程序员需要掌握的各项知识,其中基础和面向对象是重中之重。课程主要特点: 1. 紧跟C#发展,使用**语言和开发环境版本。 2. 结合应用案例,力求做到深入浅出,明白易懂 通过本课的学习,使学生掌握C#语言的语法知识,理解和掌握面向对象程序设计的思想和方法,能熟练使用Visual Studio集成开发环境编写、调试和测试控制台应用软件、Winform应用软件;运用ADO.NET开发数据库应用程序,具有面向对象程序设计、分析和调试能力。 希望本套课程在你学习C#的过程中,可以对你有所帮助。

    2244 人正在学习 去看看 张晨光

       软件测试中一个重要的概念据说测试类别。

       熟悉软件测试的测试类别,将对提升测试技能有不小的帮助。

详细分类

角度细分

从是否关心软件内部结构和具体实现的角度划分(按测试分类)

A.白盒测试

B.黑盒测试

C.灰盒测试

从是否执行程序的角度

A.静态测试

B.动态测试

阶段细分

从软件开发的过程按阶段划分有

A.单元测试

B.集成测试

C.确认测试

D.系统测试

E.验收测试

F.回归测试

G.Alpha测试

H.Beta测试

* 测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试及发布测试。

* 开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。

*集成测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。

* 确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。

* 系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。

白盒测试

       白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。

黑盒测试

 黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。

灰盒测试

灰盒测试,是介于白盒测试黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试不像白盒那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些表征性的现象、事件、标志来判断内部的运行状态。

静态测试

 静态方法是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。对需求规格说明书、软件设计说明书、源程序结构分析流程图分析、符号执行来找错。静态方法通过程序静态特性的分析,找出欠缺和可疑之处,例如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用和可疑的计算等。静态测试结果可用于进一步的查错,并为测试用例选取提供指导。

动态测试

动态测试方法是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能。这种方法由三部分组成:构造测试用例执行程序、分析程序的输出结果。

单元测试 (Unit Testing)

* 单元测试又称模块测试,是针对软件设计的最小单位 ─ 程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。

* 单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。

1. 单元测试的内容

* 在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。

(1) 模块接口测试

* 在单元测试的开始,应对通过被测模块的数据流进行测试。测试项目包括:

– 调用本模块的输入参数是否正确;

– 本模块调用子模块时输入给子模块的参数是否正确;

– 全局量的定义在各模块中是否一致

* 在做内外存交换时要考虑:

– 文件属性是否正确;

– OPEN与CLOSE语句是否正确;

– 缓冲区容量与记录长度是否匹配;

– 在进行读写操作之前是否打开了文件;

– 在结束文件处理时是否关闭了文件;

– 正文书写/输入错误,

– I/O错误是否检查并做了处理。

(2) 局部数据结构测试

* 不正确或不一致的数据类型说明

* 使用尚未赋值或尚未初始化的变量

* 错误的初始值或错误的缺省值

* 变量名拼写错或书写错

* 不一致的数据类型

* 全局数据对模块的影响

(3) 路径测试

* 选择适当的测试用例,对模块中重要的执行路径进行测试。

* 应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。

* 对基本执行路径和循环进行测试可以发现大量的路径错误。

(4) 错误处理测试

* 出错的描述是否难以理解

* 出错的描述是否能够对错误定位

* 显示的错误与实际的错误是否相符

* 对错误条件的处理正确与否

* 在对错误进行处理之前,错误条件是否已经引起系统的干预等

(5) 边界测试

* 注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。

* 如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。

2. 单元测试的步骤

* 模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。

– 驱动模块 (driver)

– 桩模块 (stub) ── 存根模块

* 如果一个模块要完成多种功能,可以将这个模块看成由几个小程序组成。必须对其中的每个小程序先进行单元测试要做的工作,对关键模块还要做性能测试。

* 对支持某些标准规程的程序,更要着手进行互联测试。有人把这种情况特别称为模块测试,以区别单元测试。

集成测试(Integrated Testing)

* 集成测试 (组装测试、联合测试)

* 通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题是:

– 在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;

– 一个模块的功能是否会对另一个模块的功能产生不利的影响

– 各个子功能组合起来,能否达到预期要求的父功能;

– 全局数据结构是否有问题;

– 单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。

在单元测试的同时可进行集成测试,发现并排除在模块连接中可能出现的问题,最终构成要求的软件系统。

* 子系统的集成测试特别称为部件测试,它所做的工作是要找出集成后的子系统与系统需求规格说明之间的不一致。

* 通常,把模块集成成为系统的方式有两种

– 一次性集成方式

– 增殖式集成方式

1. 一次性集成方式(big bang)

* 它是一种非增殖式组装方式。也叫做整体拼装。

* 使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统。

2. 增殖式集成方式

* 这种集成方式又称渐增式集成

* 首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统

* 在集成的过程中边连接边测试,以发现连接过程中产生的问题

* 通过增殖逐步组装成为要求的软件系统。

(1) 自顶向下的增殖方式

* 这种集成方式将模块按系统程序结构,沿控制层次自顶向下进行组装。

* 自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。

* 选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。

(2) 自底向上的增殖方式

* 这种集成的方式是从程序模块结构的最底层的模块开始集成和测试。

* 因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。

* 自顶向下增殖的方式和自底向上增殖的方式各有优缺点。

* 一般来讲,一种方式的优点是另一种方式的缺点。

(3) 混合增殖式测试

* 衍变的自顶向下的增殖测试

– 首先对输入/输出模块和引入新算法模块进行测试;

– 再自底向上组装成为功能相当完整且相对独立的子系统;

– 然后由主模块开始自顶向下进行增殖测试。

* 自底向上-自顶向下的增殖测试

– 首先对含读操作的子系统自底向上直至根结点模块进行组装和测试;

– 然后对含写操作的子系统做自顶向下的组装与测试。

* 回归测试

– 这种方式采取自顶向下的方式测试被修改的模块及其子模块;

– 然后将这一部分视为子系统,再自底向上测试。

关键模块问题

* 在组装测试时,应当确定关键模块,对这些关键模块及早进行测试。

* 关键模块的特征:

① 满足某些软件需求

② 在程序的模块结构中位于较高的层次(高层控制模块)

③ 较复杂、较易发生错误

④ 有明确定义的性能要求。

确认测试(Validation Testing)

* 确认测试又称有效性测试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。

* 对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。

1. 进行有效性测试(黑盒测试

* 有效性测试是在模拟的环境 (可能就是开发的环境) 下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。

* 首先制定测试计划,规定要做测试的种类。还需要制定一组测试步骤,描述具体的测试用例。

* 通过实施预定的测试计划和测试步骤,确定

– 软件的特性是否与需求相符;

– 所有的文档都是正确且便于使用;

– 同时,对其它软件需求,例如可移植性、兼容性、出错自动恢复、可维护性等,也都要进行测试

* 在全部软件测试的测试用例运行完后,所有的测试结果可以分为两类:

– 测试结果与预期的结果相符。这说明软件的这部分功能或性能特征与需求规格说明书相符合,从而这部分程序被接受。

– 测试结果与预期的结果不符。这说明软件的这部分功能或性能特征与需求规格说明不一致,因此要为它提交一份问题报告。

2. 软件配置复查

软件配置复查的目的是保证软件配置的所有成分都齐全;

各方面的质量都符合要求;

具有维护阶段所必需的细节;

而且已经编排好分类的目录。

应当严格遵守用户手册和操作手册中规定的使用步骤,以便检查这些文档资料的完整性和正确性。

系统测试(System Testing)

* 系统测试,是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。

* 系统测试的目的在于通过与系统的需求定义作比较, 发现软件与系统的定义不符合或与之矛盾的地方。

验收测试(Acceptance Testing)

* 在通过了系统的有效性测试及软件配置审查之后,就应开始系统的验收测试。

* 验收测试是以用户为主的测试。软件开发人员和QA(质量保证)人员也应参加。

* 由用户参加设计测试用例,使用生产中的实际数据进行测试。

* 在测试过程中,除了考虑软件的功能和性能外,还应对软件的可移植性、兼容性、可维护性、错误的恢复功能等进行确认。

*确认测试应交付的文档有:

– 确认测试分析报告

– 最终的用户手册和操作手册

– 项目开发总结报告。

回归测试

回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。

回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极端编程方法中,更是要求每天都进行若干次回归测试。因此,通过选择正确的回归测试策略来改进回归测试的效率和有效性是很有意义的。

α测试

 Alpha测试一般指α测试

α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。α测试的目的是评价软件产品的FLURPS(即功能、局域化、可用性、可靠性、性能和支持)。尤其注重产品的界面和特色。α测试可以从软件产品编码结束之时开始,或在模块(子系统)测试完成之后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程度之后再开始。α测试即为非正式验收测试。

Beta测试

Beta测试是一种验收测试。所谓验收测试是软件产品完成了功能测试系统测试之后,在产品发布之前所进行的软件测试活动,它是技术测试的最后一个阶段,通过了验收测试,产品就会进入发布阶段。验收测试一般根据产品规格说明书严格检查产品,逐行逐字地对照说明书上对软件产品所做出的各方面要求, 确保所开发的软件产品符合用户的各项要求。 通过综合测试之后,软件已完全组装起来,接口方面的错误也已排除,软件测试的最后一步——验收测试即可开始。验收测试应检查软件能否按合同要求进行工作,即是否满足软件需求说明书中的确认标准。

        熟悉软件测试的类别的各个定义,将很好的熟悉软件测试,熟悉软件测试的各个不同的阶段,熟悉软件测试的方法,技巧,以及,对于如何安排测试工作,有个更深刻的理解和更好的想法。

        当我在2009年,初次接触软件测试时,刚开始,做得最多的一件事情,就是,去熟悉软件测试的各个不同的定义,去理解它们,并将理解运用于软件测试的工作当中,熟悉软件测试的各个类别,对于理解软件测试流程也有非常好的辅助作用。

        刚接触软件测试,一般刚开始时,培训的重点,也就是软件测试的流程了。

 

2011-03-15 13:10:34 usenrong 阅读数 72
  • C#程序设计与宿舍管理系统实战

    为什么要学习C#?C#是微软的王牌语言,拥有接近20年的历史和广泛的应用。目前国内对C#的书籍和视频相对较少,但C#和.NET的发展前程是十分光明的,这体现在微软公司本身强劲的实力,C#的开源,.NET Core社区的蓬勃发展,以及.NET开发岗位需求的不断增加。C#用途广泛,容易上手。可以说,如果你熟悉C#语言,你将不愁找不到好的工作。 本课程详细的讲述了一名C#初级程序员需要掌握的各项知识,其中基础和面向对象是重中之重。课程主要特点: 1. 紧跟C#发展,使用**语言和开发环境版本。 2. 结合应用案例,力求做到深入浅出,明白易懂 通过本课的学习,使学生掌握C#语言的语法知识,理解和掌握面向对象程序设计的思想和方法,能熟练使用Visual Studio集成开发环境编写、调试和测试控制台应用软件、Winform应用软件;运用ADO.NET开发数据库应用程序,具有面向对象程序设计、分析和调试能力。 希望本套课程在你学习C#的过程中,可以对你有所帮助。

    2244 人正在学习 去看看 张晨光

软件测试错误类型 软件测试工具

定义以下五类测试错误类型:

A类—严重错误,包括以下各种错误:
由于程序所引起的死机,非法退出
死循环
数据库发生死锁
因错误操作导致的程序中断
功能错误
与数据库连接错误
数据通讯错误


B类—较严重错误,包括以下各种错误:
程序错误
程序接口错误
数据库的表、业务规则、缺省值未加完整性等约束条件

 


C类—一般性错误,包括以下各种错误:
操作界面错误(包括数据窗口内列名定义、含义是否一致)
打印内容、格式错误
简单的输入限制未放在前台进行控制
删除操作未给出提示
数据库表中有过多的空字段


D类—较小错误,包括以下各种错误:
界面不规范
辅助说明描述不清楚
输入输出不规范
长操作未给用户提示
提示窗口文字未采用行业术语
可输入区域和只读区域没有明显的区分标志

2008-03-05 09:26:00 djbtestingsky 阅读数 2646
  • C#程序设计与宿舍管理系统实战

    为什么要学习C#?C#是微软的王牌语言,拥有接近20年的历史和广泛的应用。目前国内对C#的书籍和视频相对较少,但C#和.NET的发展前程是十分光明的,这体现在微软公司本身强劲的实力,C#的开源,.NET Core社区的蓬勃发展,以及.NET开发岗位需求的不断增加。C#用途广泛,容易上手。可以说,如果你熟悉C#语言,你将不愁找不到好的工作。 本课程详细的讲述了一名C#初级程序员需要掌握的各项知识,其中基础和面向对象是重中之重。课程主要特点: 1. 紧跟C#发展,使用**语言和开发环境版本。 2. 结合应用案例,力求做到深入浅出,明白易懂 通过本课的学习,使学生掌握C#语言的语法知识,理解和掌握面向对象程序设计的思想和方法,能熟练使用Visual Studio集成开发环境编写、调试和测试控制台应用软件、Winform应用软件;运用ADO.NET开发数据库应用程序,具有面向对象程序设计、分析和调试能力。 希望本套课程在你学习C#的过程中,可以对你有所帮助。

    2244 人正在学习 去看看 张晨光
前段时间学员去笔试遇到的. 
北京博彦科技一道C笔试

分别填入一个语句,完成下面的函数,通过递归计算数组a[100]的前n个数之和。
int sum ( int a[],int n )
{
  if (n>0) return______1__;
  else return___2________;
}

1.  a[n-1]+sum(a,n-1)

2.  0

题目其实很简单,就是考察一下递归的整个过程,你了解于否.

其实就是用递归实现一个累加.

2008-02-27 13:12:00 djbtestingsky 阅读数 1297
  • C#程序设计与宿舍管理系统实战

    为什么要学习C#?C#是微软的王牌语言,拥有接近20年的历史和广泛的应用。目前国内对C#的书籍和视频相对较少,但C#和.NET的发展前程是十分光明的,这体现在微软公司本身强劲的实力,C#的开源,.NET Core社区的蓬勃发展,以及.NET开发岗位需求的不断增加。C#用途广泛,容易上手。可以说,如果你熟悉C#语言,你将不愁找不到好的工作。 本课程详细的讲述了一名C#初级程序员需要掌握的各项知识,其中基础和面向对象是重中之重。课程主要特点: 1. 紧跟C#发展,使用**语言和开发环境版本。 2. 结合应用案例,力求做到深入浅出,明白易懂 通过本课的学习,使学生掌握C#语言的语法知识,理解和掌握面向对象程序设计的思想和方法,能熟练使用Visual Studio集成开发环境编写、调试和测试控制台应用软件、Winform应用软件;运用ADO.NET开发数据库应用程序,具有面向对象程序设计、分析和调试能力。 希望本套课程在你学习C#的过程中,可以对你有所帮助。

    2244 人正在学习 去看看 张晨光
各大外包公司软件测试工程师高频出现的一道C编程题
这道题目憋了好半天,才作出来.看来老不自己写程序.手生了.估计可能还有些问题,如果你阅读程序的时候发现了,请帮助改正.好吗? 
字符串翻转:
例:原字符串 "I am a student." 转化为"student. a am I"
要求不能用库函数.

#include<stdio.h>
#include<string.h>
void main()
{
 char a[20]={"I am a student."};
 char b[20];//逆序后存储到b[20]中
 int j;//j控制循环次数
 int k=0,m=0,n;
 int length=0;
 int num=0;//串中子串的个数。
 
 for(;a[length]!='/0';length++);//求出串的长度,用length来表示.

 for(j=length-k-1;j>=0;j--)
 {   
   if(a[j]!=' ')
    k++;//k含义是求空格后有多少个字符。
   else
   {
    n=j;
    for(;k>=1;m++,n++,k--)
     b[m]=a[n+1];
    b[m]=' ';
   m++; 
   }
  
 }

   for(;k>=1;m++,j++,k--)
  b[m]=a[j+1];


   //测试程序,用puts()函数输出.
   b[m]='/0';
 puts(b);
}
 

软件测试入门

阅读数 1655

软件测试(白盒)

阅读数 808

软件测试

阅读数 574

软件测试风险分析

阅读数 1790

没有更多推荐了,返回首页