No.02 (byte b3 = b1 + b2 ; ) ?

本文详细解析了Java中的基本数据类型,包括整数型、浮点型、字符型及布尔型,并通过实例演示了不同数据类型之间的运算规则及其可能产生的问题。

基本数据类型

先看如下一段代码:

class Test {
public static void main (String [] args){
byte b1 , b2 , b3;
b1 = 3 ;
b2 = 4 ;
b3 = b1 + b2 ;
}
}

代码编译后会报错:“错误: 不兼容的类型: 从int转换到byte可能会有损失”

那么为什么会报错呢?

java 中的基本数据类型共有四类八种分别是
*整数型
byte 1字节 -128~+127;
short 2字节 -2^15~2^15-1;
int 4字节 -2^31~2^31-1;
long 8字节 -2^63~2^63-1
*浮点型
float 占四个字节 -3.403E38~3.403E38 单精度
double 占八个字节-1.798E308~1.798E308 双精度
* 字符型
char 占两个字节 0~65535 (ASCII表)
* 布尔型
boolean
boolean理论上是占八分之一个字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定他的大小
java 默认的整型运算时int型, b3 = b1 + b2 ; b1+b2的运算结果默认成int型 ,而b3却是byte型,将int型值赋予byte将导致精度损失,反小的数据类型赋值给大的却不会
class Test {
public static void main (String [] args){
byte b1 , b2 ;
b1 = 3 ;
b2 = 4 ;
int b3 = b1 + b2 ;
}
}

对于第一段代码,如果强制转换虽然不会报错,但是会产生一些意想不到的结果;

class Test {
public static void main (String [] args){
byte b1 , b2 , b3;
b1 = 113 ;
b2 = 124 ;
b3 =(byte) (b1 + b2) ;
}
}

这里的结果是-19,

java 中整型计算都是以二进制进行的,是在对应的数的补码之间相互计算的
113 的二进制表示方法是 01110001 ,首位的0代表是正数,
对于正数,原码反码补码都是自己本身
124的 二进制表示方法是 01111100
对两个数的补码相加得到11101101,首位的1表示负数,负数的补码求取方式是首位不变,其后逐位取反得到反码,反码末位加1即得补码,11101101经过还原后得到原码10010011,即-19。

/* Result Sets Interface */ #ifndef SQL_CRSR # define SQL_CRSR struct sql_cursor { unsigned int curocn; void *ptr1; void *ptr2; unsigned int magic; }; typedef struct sql_cursor sql_cursor; typedef struct sql_cursor SQL_CURSOR; #endif /* SQL_CRSR */ /* Thread Safety */ typedef void * sql_context; typedef void * SQL_CONTEXT; /* Object support */ struct sqltvn { unsigned char *tvnvsn; unsigned short tvnvsnl; unsigned char *tvnnm; unsigned short tvnnml; unsigned char *tvnsnm; unsigned short tvnsnml; }; typedef struct sqltvn sqltvn; struct sqladts { unsigned int adtvsn; unsigned short adtmode; unsigned short adtnum; sqltvn adttvn[1]; }; typedef struct sqladts sqladts; static struct sqladts sqladt = { 1,1,0, }; /* Binding to PL/SQL Records */ struct sqltdss { unsigned int tdsvsn; unsigned short tdsnum; unsigned char *tdsval[1]; }; typedef struct sqltdss sqltdss; static struct sqltdss sqltds = { 1, 0, }; /* File name & Package Name */ struct sqlcxp { unsigned short fillen; char filnam[16]; }; static struct sqlcxp sqlfpn = { 15, "store_ngskip.pc" }; static unsigned int sqlctx = 2697803; static struct sqlexd { unsigned long sqlvsn; unsigned int arrsiz; unsigned int iters; unsigned int offset; unsigned short selerr; unsigned short sqlety; unsigned int occurs; short *cud; unsigned char *sqlest; char *stmt; sqladts *sqladtp; sqltdss *sqltdsp; unsigned char **sqphsv; unsigned long *sqphsl; int *sqphss; short **sqpind; int *sqpins; unsigned long *sqparm; unsigned long **sqparc; unsigned short *sqpadto; unsigned short *sqptdso; unsigned int sqlcmax; unsigned int sqlcmin; unsigned int sqlcincr; unsigned int sqlctimeout; unsigned int sqlcnowait; int sqfoff; unsigned int sqcmod; unsigned int sqfmod; unsigned int sqlpfmem; unsigned char *sqhstv[12]; unsigned long sqhstl[12]; int sqhsts[12]; short *sqindv[12]; int sqinds[12]; unsigned long sqharm[12]; unsigned long *sqharc[12]; unsigned short sqadto[12]; unsigned short sqtdso[12]; } sqlstm = {13,12}; /* SQLLIB Prototypes */ extern sqlcxt (/*_ void **, unsigned int *, struct sqlexd *, struct sqlcxp * _*/); extern sqlcx2t(/*_ void **, unsigned int *, struct sqlexd *, struct sqlcxp * _*/); extern sqlbuft(/*_ void **, char * _*/); extern sqlgs2t(/*_ void **, char * _*/); extern sqlorat(/*_ void **, unsigned int *, void * _*/); /* Forms Interface */ static int IAPSUCC = 0; static int IAPFAIL = 1403; static int IAPFTL = 535; extern void sqliem(/*_ unsigned char *, signed int * _*/); typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; typedef struct { unsigned short len; unsigned char arr[1]; } varchar; /* CUD (Compilation Unit Data) Array */ static short sqlcud0[] = {13,4130,1,0,0, 5,0,0,0,0,0,27,60,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0, 36,0,0,2,0,0,32,64,0,0,0,0,0,1,0, 51,0,0,3,0,0,32,80,0,0,0,0,0,1,0, 66,0,0,4,0,0,31,115,0,0,0,0,0,1,0, 81,0,0,5,71,0,4,120,0,0,1,0,0,1,0,2,97,0,0, 100,0,0,6,174,0,3,159,0,0,7,7,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,97,0,0,1,97,0, 0,1,97,0,0,1,0,0,0, 143,0,0,7,143,0,3,189,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,0,0,0, 174,0,0,8,0,0,29,229,0,0,0,0,0,1,0, 189,0,0,9,0,0,31,232,0,0,0,0,0,1,0, 204,0,0,10,0,0,31,258,0,0,0,0,0,1,0, 219,0,0,11,229,0,3,322,0,0,12,12,0,1,0,1,97,0,0,1,3,0,0,1,97,0,0,1,97,0,0,1,97, 0,0,1,97,0,0,1,97,0,0,1,3,0,0,1,97,0,0,1,97,0,0,1,97,0,0,1,0,0,0, }; /****************************************************************************** 受発注連携クライアント DB処理 mod:2018/5/21 SQLエラー時にabortするよう修正 mod:2019/10/7 発注データ内容不正時の処理追加 ******************************************************************************/ #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*** add 2019/10/7 start ***/ #include <errno.h> /*** add 2019/10/7 end ***/ #include <sqlda.h> #include <sqlcpr.h> #include "logging.h" #include "bj_onl_trn_client.h" #include "store.h" /*** add 2019/10/7 start ***/ #include "config.h" /*** add 2019/10/7 end ***/ /* procコマンドでエラーが表示されるため _DEBUG_のときのみインクルードする */ #ifdef _DEBUG_ #include "trace.h" #else #define _TRACE_(level, body) #endif /****************************************************************************** ホスト変数 ******************************************************************************/ char dbname[DB_NAME_LEN+1]; char username[DB_USERNAME_LEN+1]; char password[DB_PASSWORD_LEN+1]; char process_name[LEN_PG_ID+1]; struct odr_trn_head trn_head; struct odr_trn_mei trn_mei; /****************************************************************************** sqlca ******************************************************************************/ #include <sqlca.h> /****************************************************************************** 初期化 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_initialize() { _TRACE_(10, ("username [%s] password [%s] dbname [%s]" , username, password, dbname)); /* データベースへの接続 */ /* EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )10; sqlstm.offset = (unsigned int )5; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)username; sqlstm.sqhstl[0] = (unsigned long )21; sqlstm.sqhsts[0] = ( int )21; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)password; sqlstm.sqhstl[1] = (unsigned long )41; sqlstm.sqhsts[1] = ( int )41; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)dbname; sqlstm.sqhstl[2] = (unsigned long )21; sqlstm.sqhsts[2] = ( int )21; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlstm.sqlcmax = (unsigned int )100; sqlstm.sqlcmin = (unsigned int )2; sqlstm.sqlcincr = (unsigned int )1; sqlstm.sqlctimeout = (unsigned int )0; sqlstm.sqlcnowait = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } _TRACE_(0, ("sqlcode : %d", sqlca.sqlcode)); if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database connect error %s%", sqlca.sqlerrm.sqlerrmc); /* EXEC SQL ROLLBACK RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )36; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return -1; } return 0; } /****************************************************************************** 終了 返り値 0 : OK ******************************************************************************/ int store_terminate() { _TRACE_(10, ("")); /* データベースからの切断 */ /* EXEC SQL ROLLBACK WORK RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )51; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return 0; } /****************************************************************************** トランザクションの開始 返り値 0 : OK ******************************************************************************/ int store_begin(char *trn_file_id) { _TRACE_(10, ("")); log_printf(LOG_INFO, "START TRN_FILE_ID=%s", trn_file_id); /* 発注キュー及び発注トランヘッダ用ホスト変数の初期化 */ memset(&trn_head, 0, sizeof(trn_head)); /* トランファイルIDをホスト変数へ格納 */ strncpy(trn_head.trn_file_id, trn_file_id, LEN_TRN_FILE_ID); return 0; } /*** add 2019/10/7 start ***/ /****************************************************************************** 発注データINSERTエラー時の処理 ******************************************************************************/ int store_ins_error(char *buffer, size_t size) { char timestamp_buf[18]; FILE *temp_file = NULL; char temp_filename[PATH_MAX]; _TRACE_(10, ("")); _TRACE_(10, ("trn_file_id [%s]", trn_head.trn_file_id)); /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )66; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } memset(timestamp_buf, 0, sizeof(timestamp_buf)); memset(temp_filename, 0, sizeof(temp_filename)); /* EXEC SQL SELECT TO_CHAR(SYSTIMESTAMP,&#39;YYYYMMDDHH24MISSFF3&#39;) INTO :timestamp_buf FROM DUAL; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "select TO_CHAR(SYSTIMESTAMP,&#39;YYYYMMDDHH24MISSFF3&#39;) into :\ b0 from DUAL "; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )81; sqlstm.selerr = (unsigned short)1; sqlstm.sqlpfmem = (unsigned int )0; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)timestamp_buf; sqlstm.sqhstl[0] = (unsigned long )18; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database session error%s%", sqlca.sqlerrm.sqlerrmc); abort(); } else { /* TEMPファイル出力 */ sprintf(temp_filename, "%s_%s.TEMP.%s" , get_config()->log_file , get_config()->process_name , timestamp_buf); temp_file = fopen(temp_filename, "ab+"); if(temp_file == NULL) { log_printf(LOG_ERROR, "TEMP file open error : [%s] %s(%d)",temp_filename, strerror(errno), errno); abort(); } fwrite(buffer, size, 1, temp_file); fclose(temp_file); log_printf(LOG_WARN, "SKIP TRN_FILE_ID=%s TEMP_FILE=%s", trn_head.trn_file_id, temp_filename); } return 0; } /*** add 2019/10/7 end ***/ /****************************************************************************** 仕上げの処理(発注トランヘッダテーブルと発注キューテーブルの登録) 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_finish() { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* 発注トランヘッダテーブルへINSERT */ while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_ODR_TRN_HEAD (TRN_FILE_ID,HCHIKU_HEAD,TENBAN_HEAD, RCV_DATE,RCV_TIME,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_head.hchiku_head,:trn_head.tenban_head ,:trn_head.rcv_date,:trn_head.rcv_time,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_ODR_TRN_HEAD (TRN_FILE_ID,HCHIKU_HEA\ D,TENBAN_HEAD,RCV_DATE,RCV_TIME,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) values\ (:b0,:b1,:b2,:b3,:b4,systimestamp,:b5,:b5)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )100; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)(trn_head.hchiku_head); sqlstm.sqhstl[1] = (unsigned long )3; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)(trn_head.tenban_head); sqlstm.sqhstl[2] = (unsigned long )6; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)(trn_head.rcv_date); sqlstm.sqhstl[3] = (unsigned long )9; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqhstv[4] = (unsigned char *)(trn_head.rcv_time); sqlstm.sqhstl[4] = (unsigned long )10; sqlstm.sqhsts[4] = ( int )0; sqlstm.sqindv[4] = ( short *)0; sqlstm.sqinds[4] = ( int )0; sqlstm.sqharm[4] = (unsigned long )0; sqlstm.sqadto[4] = (unsigned short )0; sqlstm.sqtdso[4] = (unsigned short )0; sqlstm.sqhstv[5] = (unsigned char *)process_name; sqlstm.sqhstl[5] = (unsigned long )18; sqlstm.sqhsts[5] = ( int )0; sqlstm.sqindv[5] = ( short *)0; sqlstm.sqinds[5] = ( int )0; sqlstm.sqharm[5] = (unsigned long )0; sqlstm.sqadto[5] = (unsigned short )0; sqlstm.sqtdso[5] = (unsigned short )0; sqlstm.sqhstv[6] = (unsigned char *)process_name; sqlstm.sqhstl[6] = (unsigned long )18; sqlstm.sqhsts[6] = ( int )0; sqlstm.sqindv[6] = ( short *)0; sqlstm.sqinds[6] = ( int )0; sqlstm.sqharm[6] = (unsigned long )0; sqlstm.sqadto[6] = (unsigned short )0; sqlstm.sqtdso[6] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_ODR_TRN_HEAD error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } /* 発注キューテーブルへINSERT */ retry_count = 0; sqldone = NO; while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_HAT_QUETBL (TRN_FILE_ID,TENBAN_HEAD,PROC_FLG,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_head.tenban_head,&#39;0&#39;,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_HAT_QUETBL (TRN_FILE_ID,TENBAN_HEAD,\ PROC_FLG,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) values (:b0,:b1,&#39;0&#39;,systimest\ amp,:b2,:b2)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )143; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)(trn_head.tenban_head); sqlstm.sqhstl[1] = (unsigned long )6; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)process_name; sqlstm.sqhstl[2] = (unsigned long )18; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)process_name; sqlstm.sqhstl[3] = (unsigned long )18; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_HAT_QUETBL error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } return 0; } /****************************************************************************** トランザクションのコミット 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_commit() { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* トランザクションのコミット */ while(!sqldone) { /* EXEC SQL COMMIT WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )174; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database commit error%s%", sqlca.sqlerrm.sqlerrmc); /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )189; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if (retry_count < MAX_SQL_RETRY) { retry_count++; sleep(SQL_RETRY_TIMER); } else { abort(); } } else { sqldone = YES; } } log_printf(LOG_INFO, "END TRN_FILE_ID=%s", trn_head.trn_file_id); return 0; } /****************************************************************************** トランザクションのアボート 返り値 0 : OK ******************************************************************************/ int store_abort() { _TRACE_(10, ("")); /* トランザクションのアボート */ /* EXEC SQL ROLLBACK WORK; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 7; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )204; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } log_printf(LOG_INFO, "ABORT TRN_FILE_ID=%s", trn_head.trn_file_id); return 0; } /****************************************************************************** 発注データ(ヘッダ部)処理 返り値 0 : OK ******************************************************************************/ int store_add_head(interm_head_def *interm_head) { _TRACE_(10, ("")); /* 値のホスト変数への格納 */ memcpy(trn_head.hchiku_head, interm_head->hchiku, LEN_HCHIKU); memcpy(trn_head.tenban_head, interm_head->tenban, LEN_TENBAN); memcpy(trn_head.rcv_date, interm_head->rcv_date, LEN_RCV_DATE); memcpy(trn_head.rcv_time, interm_head->rcv_time, LEN_RCV_TIME); return 0; } /****************************************************************************** 発注データ(データ部)処理 返り値 0 : OK ******************************************************************************/ int store_add_data(interm_data_def *intinterm_data) { _TRACE_(10, ("")); /* 発注トラン明細用ホスト変数の初期化 */ memset(&trn_mei, 0, sizeof(trn_mei)); /* 値のホスト変数への格納 */ trn_mei.seq_no = intinterm_data->seq_no; memcpy(trn_mei.hchiku, intinterm_data->hchiku, LEN_HCHIKU); memcpy(trn_mei.tenban, intinterm_data->tenban, LEN_TENBAN); memcpy(trn_mei.hat_date, intinterm_data->hat_date, LEN_HAT_DATE); return 0; } /****************************************************************************** 発注データ(データ部)のTEXT部処理 返り値 0 : OK -1 : エラー ******************************************************************************/ int store_add_detail(interm_detail_def *interm_detail) { int retry_count = 0; BOOL sqldone = NO; _TRACE_(10, ("")); /* 値のホスト変数への格納 */ memcpy(trn_mei.hatsk_cd, interm_detail->hatsk_cd, LEN_HATSK_CD); memcpy(trn_mei.shohin_cd, interm_detail->shohin_cd, LEN_SHOHIN_CD); trn_mei.hat_baisu =interm_detail-> hat_baisu; memcpy(trn_mei.pop_kbn, interm_detail->pop_kbn, LEN_POP_KBN); memcpy(trn_mei.hat_type, interm_detail->hat_type, LEN_HAT_TYPE); /* 発注トラン明細テーブルへINSERT */ while(!sqldone) { /* EXEC SQL INSERT INTO BJ_T_ODR_TRN_MEI (TRN_FILE_ID,SEQ_NO,HCHIKU,TENBAN,HAT_DATE ,HATSK_CD,SHOHIN_CD,HAT_BAISU,POP_KBN,HAT_TYPE ,REC_RGST_DT,REC_RGST_PG_ID,REC_RGST_ID) VALUES (:trn_head.trn_file_id,:trn_mei.seq_no,:trn_mei.hchiku,:trn_mei.tenban,:trn_mei.hat_date ,:trn_mei.hatsk_cd,:trn_mei.shohin_cd,:trn_mei.hat_baisu,:trn_mei.pop_kbn,:trn_mei.hat_type ,systimestamp,:process_name,:process_name); */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 13; sqlstm.arrsiz = 12; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = "insert into BJ_T_ODR_TRN_MEI (TRN_FILE_ID,SEQ_NO,HCHI\ KU,TENBAN,HAT_DATE,HATSK_CD,SHOHIN_CD,HAT_BAISU,POP_KBN,HAT_TYPE,REC_RGST_DT,R\ EC_RGST_PG_ID,REC_RGST_ID) values (:b0,:b1,:b2,:b3,:b4,:b5,:b6,:b7,:b8,:b9,sys\ timestamp,:b10,:b10)"; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )219; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = (unsigned char *)(trn_head.trn_file_id); sqlstm.sqhstl[0] = (unsigned long )129; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( short *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned long )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = (unsigned char *)&(trn_mei.seq_no); sqlstm.sqhstl[1] = (unsigned long )sizeof(int); sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( short *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned long )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqhstv[2] = (unsigned char *)(trn_mei.hchiku); sqlstm.sqhstl[2] = (unsigned long )3; sqlstm.sqhsts[2] = ( int )0; sqlstm.sqindv[2] = ( short *)0; sqlstm.sqinds[2] = ( int )0; sqlstm.sqharm[2] = (unsigned long )0; sqlstm.sqadto[2] = (unsigned short )0; sqlstm.sqtdso[2] = (unsigned short )0; sqlstm.sqhstv[3] = (unsigned char *)(trn_mei.tenban); sqlstm.sqhstl[3] = (unsigned long )6; sqlstm.sqhsts[3] = ( int )0; sqlstm.sqindv[3] = ( short *)0; sqlstm.sqinds[3] = ( int )0; sqlstm.sqharm[3] = (unsigned long )0; sqlstm.sqadto[3] = (unsigned short )0; sqlstm.sqtdso[3] = (unsigned short )0; sqlstm.sqhstv[4] = (unsigned char *)(trn_mei.hat_date); sqlstm.sqhstl[4] = (unsigned long )9; sqlstm.sqhsts[4] = ( int )0; sqlstm.sqindv[4] = ( short *)0; sqlstm.sqinds[4] = ( int )0; sqlstm.sqharm[4] = (unsigned long )0; sqlstm.sqadto[4] = (unsigned short )0; sqlstm.sqtdso[4] = (unsigned short )0; sqlstm.sqhstv[5] = (unsigned char *)(trn_mei.hatsk_cd); sqlstm.sqhstl[5] = (unsigned long )9; sqlstm.sqhsts[5] = ( int )0; sqlstm.sqindv[5] = ( short *)0; sqlstm.sqinds[5] = ( int )0; sqlstm.sqharm[5] = (unsigned long )0; sqlstm.sqadto[5] = (unsigned short )0; sqlstm.sqtdso[5] = (unsigned short )0; sqlstm.sqhstv[6] = (unsigned char *)(trn_mei.shohin_cd); sqlstm.sqhstl[6] = (unsigned long )9; sqlstm.sqhsts[6] = ( int )0; sqlstm.sqindv[6] = ( short *)0; sqlstm.sqinds[6] = ( int )0; sqlstm.sqharm[6] = (unsigned long )0; sqlstm.sqadto[6] = (unsigned short )0; sqlstm.sqtdso[6] = (unsigned short )0; sqlstm.sqhstv[7] = (unsigned char *)&(trn_mei.hat_baisu); sqlstm.sqhstl[7] = (unsigned long )sizeof(int); sqlstm.sqhsts[7] = ( int )0; sqlstm.sqindv[7] = ( short *)0; sqlstm.sqinds[7] = ( int )0; sqlstm.sqharm[7] = (unsigned long )0; sqlstm.sqadto[7] = (unsigned short )0; sqlstm.sqtdso[7] = (unsigned short )0; sqlstm.sqhstv[8] = (unsigned char *)(trn_mei.pop_kbn); sqlstm.sqhstl[8] = (unsigned long )3; sqlstm.sqhsts[8] = ( int )0; sqlstm.sqindv[8] = ( short *)0; sqlstm.sqinds[8] = ( int )0; sqlstm.sqharm[8] = (unsigned long )0; sqlstm.sqadto[8] = (unsigned short )0; sqlstm.sqtdso[8] = (unsigned short )0; sqlstm.sqhstv[9] = (unsigned char *)(trn_mei.hat_type); sqlstm.sqhstl[9] = (unsigned long )3; sqlstm.sqhsts[9] = ( int )0; sqlstm.sqindv[9] = ( short *)0; sqlstm.sqinds[9] = ( int )0; sqlstm.sqharm[9] = (unsigned long )0; sqlstm.sqadto[9] = (unsigned short )0; sqlstm.sqtdso[9] = (unsigned short )0; sqlstm.sqhstv[10] = (unsigned char *)process_name; sqlstm.sqhstl[10] = (unsigned long )18; sqlstm.sqhsts[10] = ( int )0; sqlstm.sqindv[10] = ( short *)0; sqlstm.sqinds[10] = ( int )0; sqlstm.sqharm[10] = (unsigned long )0; sqlstm.sqadto[10] = (unsigned short )0; sqlstm.sqtdso[10] = (unsigned short )0; sqlstm.sqhstv[11] = (unsigned char *)process_name; sqlstm.sqhstl[11] = (unsigned long )18; sqlstm.sqhsts[11] = ( int )0; sqlstm.sqindv[11] = ( short *)0; sqlstm.sqinds[11] = ( int )0; sqlstm.sqharm[11] = (unsigned long )0; sqlstm.sqadto[11] = (unsigned short )0; sqlstm.sqtdso[11] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } if(sqlca.sqlcode < 0) { log_printf(LOG_ERROR, "Database insert BJ_T_ODR_TRN_MEI error%s%", sqlca.sqlerrm.sqlerrmc); /*** mod 2019/10/7 start ***/ /* EXEC SQL ROLLBACK WORK;*/ /* if (retry_count < MAX_SQL_RETRY) {*/ /* sleep(SQL_RETRY_TIMER);*/ /* retry_count++;*/ /* } else {*/ /* abort();*/ /* }*/ if (retry_count < MAX_INS_RETRY) { sleep(SQL_RETRY_TIMER); retry_count++; } else { return -1; } /*** mod 2019/10/7 end ***/ } else { sqldone = YES; } } return 0; } /****************************************************************************** 締め処理(締め処理用の値を設定する) 返り値 0 : OK ******************************************************************************/ int store_order_closing(char *trn_file_id) { _TRACE_(10, ("")); _TRACE_(10, ("trn_file_id [%s]", trn_file_id)); /* 発注キュー及び発注トランヘッダ用ホスト変数の初期化 */ memset(&trn_head, 0, sizeof(trn_head)); /* トランファイルIDのホスト変数への格納 */ strncpy(trn_head.trn_file_id, trn_file_id, LEN_TRN_FILE_ID); /* それ以外の値へのスペースの格納 */ memset(trn_head.hchiku_head, &#39; &#39;, LEN_HCHIKU); memset(trn_head.tenban_head, &#39; &#39;, LEN_TENBAN); memset(trn_head.rcv_date, &#39; &#39;, LEN_RCV_DATE); memset(trn_head.rcv_time, &#39; &#39;, LEN_RCV_TIME); return 0; } /****************************************************************************** プログラムIDを設定する ******************************************************************************/ void store_set_process_name(const char *name) { _TRACE_(10, ("name [%s]", name)); /* プログラムIDのホスト変数への格納 */ strncpy(process_name, name, LEN_PG_ID); } /****************************************************************************** データベース名を設定する ******************************************************************************/ void store_set_name(const char *db_name) { _TRACE_(0, ("db_name [%s]", db_name)); /* データベース名のホスト変数への格納 */ strncpy(dbname, db_name, DB_NAME_LEN); } /****************************************************************************** ユーザとパスワードを設定する ******************************************************************************/ void store_set_user(const char *db_user, const char *db_password) { _TRACE_(0, ("db_user [%s]", db_user)); _TRACE_(0, ("db_password [%s]", db_password)); /* ユーザのホスト変数への格納 */ strncpy(username, db_user, DB_USERNAME_LEN); /* パスワードのホスト変数への格納 */ strncpy(password, db_password, DB_PASSWORD_LEN); } oracle转postgre 这个文件怎么改
最新发布
08-22
#include<p30f6015.h> #include<sinabc.h> #include<can.h> #define BITRATE 10000 // 10kbps #define NTQ 16 // Number of Tq cycles which will make the //CAN Bit Timing . #define BRP_VAL ((FCY/(2*NTQ*BITRATE))-1) //Formulae used for C1CFG1bits.BRP #define CAN_RX_AS_IN() {TRISFbits.TRISF0=1;} // #define CAN_RX PORTFbits.RF0 #define CAN_TX_AS_OUT() {TRISFbits.TRISF1=0;} // #define CAN_TX_SET() {LATFbits.LATF1=1;}// #define CAN_TX_CLR() {LATFbits.LATF1=0;}// #define CAN_TX LATFbits.LATF1 /************************************************************************** * Function Name: CAN1AbortAll中止等待中的发送 * Description: This function sets the ABAT bit in C1CTRL register * thus initiating the abort of all pending transmissions * Parameters: None * Return Value: None ***************************************************************************/ void CAN1AbortAll(void) { C1CTRLbits.ABAT = 1; } /********************************************************************* * Function Name : CAN1GetRXErrorCount接收错误计数值 * Description : This function gets the receiver error count * Parameters : None * Return Value : unsigned char: receiver error count *********************************************************************/ unsigned char CAN1GetRXErrorCount(void) { return C1RERRCNT; /* returns the lower byte of C1EC */ } /********************************************************************* * Function Name : CAN1GetTXErrorCount发送错误计数值 * Description : This function gets the transmit error count * Parameters : None * Return Value : unsigned char: transmit error count *********************************************************************/ unsigned char CAN1GetTXErrorCount(void) { return C1TERRCNT; /* upper byte of C1EC */ } /************************************************************************* * Function Name : CAN1Initialize初始化CAN * Description : This function configures Sync jump width, Baud Rate * Pre-scaler, Phase Buffer Segment 1 and 2, and * Propogation time segment. * Parameters : unsigned int: config1, unsigned int: config2 * Return Value : None **************************************************************************/ void CAN1Initialize(unsigned int config1, unsigned int config2) { C1CFG1 = config1; /* configure SJW and BRP */ C1CFG2 = config2; /* configure PHSEG2 and PHSEG1 and PROPSEG */ } /************************************************************************* * Function Name : CAN1IsBusOff总线是否为关闭状态 * Description : This function returns the status of the node, * indicating whether CAN is in BusOff error mode. * Parameters : None * Return Value : char:TXBO bit status *********************************************************************/ char CAN1IsBusOff(void) { return C1INTFbits.TXBO; } /*************************************************************************** * Function Name : CAN1IsRXPassive接收器是否为错误被动状态 * Description : This function returns the state of CAN receiver whether * it is in error passive mode. * Parameters : None * Return Value : char: RXEP bit status ***************************************************************************/ char CAN1IsRXPassive(void) { return C1INTFbits.RXEP; } /*************************************************************************** * Function Name : CAN1IsRXReady是否接收到新消息 * Description : This function returns RXFUL bit status which indicates * whether the receive buffer contains any received message * Parameters : char buffno * Return Value : char: RXFUL bit status ****************************************************************************/ char CAN1IsRXReady(char buffno) { switch(buffno) { case 0: return C1RX0CONbits.RXFUL; case 1: return C1RX1CONbits.RXFUL; } return 0; } /*************************************************************************** * Function Name : CAN1IsTXPassive发送器是否为错误被动状态 * Description : This function returns the state of CAN tranmitter * whether it is in error passive mode. * Parameters : None * Return Value : char:TXEP bit status ****************************************************************************/ char CAN1IsTXPassive(void) { return C1INTFbits.TXEP; } /**************************************************************************** * Function Name : CAN1IsTXReady发送是否准备好 * Description : This function returns TXREQ bit status which indicates * whether the transmitter is ready for next transmission. * Parameters : char: buffno * Return Value : char: compliment of TXREQ bit status *****************************************************************************/ char CAN1IsTXReady(char buffno) { switch(buffno) { case 0: return !(C1TX0CONbits.TXREQ); break; case 1: return !(C1TX1CONbits.TXREQ); break; case 2: return !(C1TX2CONbits.TXREQ); break; } return 0; } /************************************************************************* * Function Name : CAN1ReceiveMessage从缓冲器中读数据 * Description : This function reads the data from the receive buffer * into an array. * Parameters : unsigned char*: data pointer * unsigned char: datalen * char: MsgFlag * Return Value : void **************************************************************************/ void CAN1ReceiveMessage(unsigned char * data, unsigned char datalen, char MsgFlag) { int i; for(i = 0;i<datalen;i++) { switch(MsgFlag) { case 0: data[i] = *((unsigned char *)&C1RX0B1 + i); break; case 1: data[i] = *((unsigned char *)&C1RX1B1 + i); break; default: data[i] = *((unsigned char *)&C1RX0B1 + i); break; } } } /****************************************************************************** * Function Name : CAN1SendMessage发送数据 * Description : This function writes the message identifiers (SID, EID), writes the data to be transmitted into the Transmit buffer * and sets the corresponding Transmit request bit. * Parameters : unsigned long: id * unsigned char: * data * unsigned char: datalen * char: MsgFlag * Return Value : None *******************************************************************************/ void CAN1SendMessage(unsigned int sid, unsigned long eid, unsigned char * data, unsigned char datalen, char MsgFlag) { int i; unsigned int uppereid = eid >> 16; switch(MsgFlag) { case 0: C1TX0SID = sid; C1TX0EID = uppereid; C1TX0DLC = eid; break; case 1: C1TX1SID = sid; C1TX1EID = uppereid; C1TX1DLC = eid; break; case 2: C1TX2SID = sid; C1TX2EID = uppereid; C1TX2DLC = eid; break; default: C1TX0SID = sid; C1TX0EID = uppereid; C1TX0DLC = eid; break; } for(i = 0;i < datalen;i++) { switch(MsgFlag) { case 0: *((unsigned char *)&C1TX0B1+i)= data[i]; break; case 1: *((unsigned char *)&C1TX1B1+i)= data[i]; break; case 2: *((unsigned char *)&C1TX2B1+i)= data[i]; break; default:*((unsigned char *)&C1TX0B1+i)= data[i]; break; } } /* Msg send request */ switch(MsgFlag) { case 0: C1TX0DLCbits.DLC = datalen; C1TX0CONbits.TXREQ = 1; break; case 1: C1TX1DLCbits.DLC = datalen; C1TX1CONbits.TXREQ = 1; break; case 2: C1TX2DLCbits.DLC = datalen; C1TX2CONbits.TXREQ = 1; break; default: C1TX0DLCbits.DLC = datalen; C1TX0CONbits.TXREQ = 1; break; } } /********************************************************************* * Function Name : CAN1SetFilter设置接收过滤值 * Description : This function sets the acceptance filter values * (SID and EID) for the specified filter * Parameters : char: filter_no * unsigned int: sid register value * unsigned long: eid registers value * Return Value : None *********************************************************************/ void CAN1SetFilter(char filter_no, unsigned int sid, unsigned long eid) { unsigned int uppereid = eid >>16; switch(filter_no) { case 0: C1RXF0SID = sid; C1RXF0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF0EIDL = eid; /*lower 16 to EIDL */ break; case 1: C1RXF1SID = sid; C1RXF1EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF1EIDL = eid; /*lower 16 to EIDH */ break; case 2: C1RXF2SID = sid; C1RXF2EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF2EIDL = eid; /*lower 16 to EIDL */ break; case 3: C1RXF3SID = sid; C1RXF3EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF3EIDL = eid; /*lower 16 to EIDL */ break; case 4: C1RXF4SID = sid; C1RXF4EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF4EIDL = eid; /*lower 16 to EIDL */ break; case 5: C1RXF5SID = sid; C1RXF5EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF5EIDL = eid; /*lower 16 to EIDL */ break; default: C1RXF0SID = sid; C1RXF0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXF0EIDL = eid; /*lower 16 to EIDL */ break; } } /************************************************************************* * Function Name : CAN1SetMask设置接收屏蔽值 * Description : This function sets the values for the acceptance * filter mask registers (SID and EID) * Parameters : char: mask_no * unsigned int: sid register value * unsigned long: eid registers value * Return Value : None **************************************************************************/ void CAN1SetMask(char mask_no, unsigned int sid, unsigned long eid) { unsigned int uppereid = eid >>16; switch(mask_no) { case 0: C1RXM0SID = sid; C1RXM0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXM0EIDL = eid; /*lower 16 to EIDL */ break; case 1: C1RXM1SID = sid; C1RXM1EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXM1EIDL = eid; /*lower 16 to EIDL */ break; default: C1RXM0SID = sid; C1RXM0EIDH = uppereid; /*upper 16 to the EIDH reg */ C1RXM0EIDL = eid; /*lower 16 to EIDL */ break; } } /*************************************************************************** * Function Name : CAN1SetOperationMode配置模块 * Description : This function configures the following bits of CxCTRL: * CSIDL, REQOP<2:0> and CANCKS * Parameters : unsigned int config * Return Value : None ****************************************************************************/ void CAN1SetOperationMode(unsigned int config) { C1CTRL = config; } /********************************************************************************* * Function Name : CAN1SetOperationModeNoWait * Description : This function sets the abort bit and configures the * following bits of CxCTRL: CSIDL, REQOP<2:0> and CANCKS * Parameters : unsigned int config * Return Value : None **********************************************************************************/ void CAN1SetOperationModeNoWait(unsigned int config) { C1CTRLbits.ABAT = 1; C1CTRL = config; } /**************************************************************************** * Function Name : CAN1SetRXMode接收器配置 * Description : This function configures the CxRXxCON register * Parameters : char buffno, unsigned int config * Return Value : None *****************************************************************************/ void CAN1SetRXMode(char buffno, unsigned int config) { switch(buffno) { case 0: C1RX0CON = config; break; case 1: C1RX1CON = config; break; default: C1RX0CON = config; break; } } /**************************************************************************** * Function Name : CAN1SetTXMode发送器配置 * Description : This function configures the CxTXxCON register * Parameters : char buffno, unsigned int config * Return Value : None *****************************************************************************/ void CAN1SetTXMode(char buffno, unsigned int config) { switch(buffno) { case 0: C1TX0CON = config; break; case 1: C1TX1CON = config; break; case 2: C1TX2CON = config; break; default: C1TX0CON = config; break; } } /* TQ=1/(BAD*K) BRP=(TQ*FCAN)/2-1 FOSC=40MHz C1CTRL C1CFG1 C1CFG2 波特率 同步 相位2 相位1 广播 FCAN 0x0C00 0x0031 0x01a1 10KHz 1 1 5 3 FCY 0x0C00 0x0018 0x01a1 20KHz 1 1 5 3 FCY 0x0C00 0x0009 0x01a1 50KHz 1 1 5 3 FCY 0x0C00 0x0004 0x01a1 100KHz 1 1 5 3 FCY 0x0C00 0x0003 0x01a1 125KHz 1 1 5 3 FCY 0x0400 0x0004 0x01BC 250KHz 1 2 8 5 FOSC 0x0400 0x0003 0x01a1 500KHz 1 1 5 3 FOSC */ void Can_ini(void) { CAN_RX_AS_IN(); CAN_TX_AS_OUT(); C1CTRL = 0x0C00; //空闲继续工作,FCAN=FCY,请求进入配置模式 while (C1CTRLbits.OPMODE!=0x4){} //确认进入配置模式 C1CFG1 = 0x0009; //波特率配置50KHZ,1tq,BRP=9 C1CFG2 = 0x01a1; //相位二:1,相位一:5,广播:3,总线采样一次,相位2自由编程 C1TX0CON = 0x0003; //发送0邮箱配置,高优先级 C1RX0CON = 0x0000; //接收0邮箱配置,dben=0 ->使能缓冲器0 C1RXF0SID = 0x0394; //接收滤波器0扩展标识符,11位->显示地址0xE5 C1RXF0EIDH = 0; //EID reg C1RXF0EIDL = 0; C1RXF1SID = 0; //接收滤波器1标准标识符,11位 C1RXF1EIDH = 0; //upper 16 to the EIDH reg C1RXF1EIDL = 0; //lower 16 to EIDL C1RXM0SID = 0x1FFC; //接收屏蔽0扩展标识符 C1RXM0EIDH = 0x0FFF; //upper 16 to the EIDH reg C1RXM0EIDL = 0xFC00; //lower 16 to EIDL C1TX0SID = 0x18d0; //发送0扩展标识符,11位 ->控制地址0xF4 C1TX0EID = 0; C1TX0DLC = 0x01c0; //发送0数据长度,8字节 C1CTRLbits.REQOP = 0x00; //请求进入正常模式 while (C1CTRLbits.OPMODE!=0x00){} //确认进入正常模式 C1INTF=0; C1INTE=0x00;// } void HandleCAN(void) { // static unsigned int count_time=0,cannum=0,xinghao=0; // unsigned long int n,m; static unsigned int step=0,step1=1; float ftemp,vatemp,vbtemp,vctemp,ierrtemp; unsigned char CAN_RxBuff[8]; //接收数据缓冲区 unsigned char CAN_TxBuff[8]; //发送数据缓冲区 if (C1INTFbits.RX0IF==1) { CAN_RxBuff[0]=C1RX0B1%0x100; CAN_RxBuff[1]=C1RX0B1/0x100; CAN_RxBuff[2]=C1RX0B2%0x100; CAN_RxBuff[3]=C1RX0B2/0x100; CAN_RxBuff[4]=C1RX0B3%0x100; CAN_RxBuff[5]=C1RX0B3/0x100; CAN_RxBuff[6]=C1RX0B4%0x100; CAN_RxBuff[7]=C1RX0B4/0x100; //上电握手和停机复位//B1 00 00 00 00 00 00 5A设置参数 if ((CAN_RxBuff[0]==0xB1)&&(CAN_RxBuff[7]==0x5A)) { DISP_OK=1;//握手 step1=1; } //启动时,控制向显示要数据1 B2 00 00 00 00 00 00 5A else if((CAN_RxBuff[0]==0xB2)&&(CAN_RxBuff[7]==0x5A)) { ftemp =CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; vatemp=CAN_RxBuff[3]*0x100+CAN_RxBuff[4]; vbtemp=CAN_RxBuff[5]*0x100+CAN_RxBuff[6]; if((ftemp>FrqHigh)||(ftemp<FrqLow) ||(vatemp>VolHigh)||(vbtemp>VolHigh)) { Data_Err=1;//设置数据错误 SET_OK=2;// Flash_Err=0x04; } else { Data_Err=0;//设备数据正确 FreqSet=ftemp; VsetA=(unsigned int )vatemp; VsetB=(unsigned int )vbtemp; // VsetC=(unsigned int )vctemp; SetUpate=1; SetHL=1; } UERR=OVP; ierrtemp=OCP; IERR110=(unsigned int )(ierrtemp*OCP1); IERR125=(unsigned int )(ierrtemp*OCP2); IERR150=(unsigned int )(ierrtemp*OCP3); IERR200=(unsigned int )(ierrtemp*OCP4); } //启动时,控制向显示要数据2 B3 00 00 00 00 00 00 5A else if((CAN_RxBuff[0]==0xB3)&&(CAN_RxBuff[7]==0x5A)) { Vol_autadj=CAN_RxBuff[1]*0x100+CAN_RxBuff[2];; vctemp=CAN_RxBuff[3]*0x100+CAN_RxBuff[4]; if((Vol_autadj>MAXB)||(vctemp>VolHigh)) { Data_Err=1;//设备数据错误 SET_OK=2;// Flash_Err=0x04; } else { VolAdj=Vol_autadj; VsetC=(unsigned int )vctemp; SetHL=2;// SET_OK=1;//数据设置正确 } } //运行时,设置电压 else if((CAN_RxBuff[0]==0xB8)&&(CAN_RxBuff[7]==0x5A)) { vatemp=CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; vbtemp=CAN_RxBuff[3]*0x100+CAN_RxBuff[4]; vctemp=CAN_RxBuff[5]*0x100+CAN_RxBuff[6]; if((vatemp>VolHigh)||(vbtemp>VolHigh)||(vctemp>VolHigh)) {;} else { VsetA=(unsigned int )vatemp; VsetB=(unsigned int )vbtemp; VsetC=(unsigned int )vctemp; } } //运行时,设置频率 else if((CAN_RxBuff[0]==0xB9)&&(CAN_RxBuff[7]==0x5A)) { ftemp=CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; if((ftemp>FrqHigh)||(ftemp<FrqLow)) {;} else { FreqSet=ftemp; SetUpate=1; } } //运行时,设置补偿电压 else if((CAN_RxBuff[0]==0xBA)&&(CAN_RxBuff[7]==0x5A)) { Vol_autadj=CAN_RxBuff[1]*0x100+CAN_RxBuff[2]; if(Vol_autadj>MAXB) {;} else { VolAdj=Vol_autadj; SetUpate=1; } } C1INTFbits.RX0IF=0; C1RX0CONbits.RXFUL=0; } else if(TxStar) { TxStar=0; switch(SYS_status)//设备状态 { case 0://上电延时状态 case 1://空闲状态 case 2://等待启动 if(DISP_OK==0)//握手命令 { CAN_TxBuff[0]=0xA1; CAN_TxBuff[1]=0x00; CAN_TxBuff[2]=0x00; CAN_TxBuff[3]=0x00; CAN_TxBuff[4]=0x00; CAN_TxBuff[5]=0x00; CAN_TxBuff[6]=0x00; CAN_TxBuff[7]=0x5A; C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 } break; case 3://发启动命令到显示,回读设置数据 if(SetHL==0) { CAN_TxBuff[0]=0xA2; } else if(SetHL==1) { CAN_TxBuff[0]=0xA3; } CAN_TxBuff[1]=0x00; CAN_TxBuff[2]=0x00; CAN_TxBuff[3]=0x00; CAN_TxBuff[4]=0x00; CAN_TxBuff[5]=0x00; CAN_TxBuff[6]=0x00; CAN_TxBuff[7]=0x5A; C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 break; case 4://启动自检 break; case 5://缓启 case 6://运行 switch(step) { case 0: step++; CAN_TxBuff[0]=0xA4; CAN_TxBuff[1]=VolA/0x100; CAN_TxBuff[2]=VolA%0x100; CAN_TxBuff[3]=CuA/0x100; CAN_TxBuff[4]=CuA%0x100; CAN_TxBuff[5]=P_A/0x100; CAN_TxBuff[6]=P_A%0x100; CAN_TxBuff[7]=0x5A; break; case 1: step++; CAN_TxBuff[0]=0xA5; CAN_TxBuff[1]=VolB/0x100; CAN_TxBuff[2]=VolB%0x100; CAN_TxBuff[3]=CuB/0x100; CAN_TxBuff[4]=CuB%0x100; CAN_TxBuff[5]=P_B/0x100; CAN_TxBuff[6]=P_B%0x100; CAN_TxBuff[7]=0x5A; break; case 2: CAN_TxBuff[0]=0xA6; CAN_TxBuff[1]=VolC/0x100; CAN_TxBuff[2]=VolC%0x100; CAN_TxBuff[3]=CuC/0x100; CAN_TxBuff[4]=CuC%0x100; CAN_TxBuff[5]=P_C/0x100; CAN_TxBuff[6]=P_C%0x100; CAN_TxBuff[7]=0x5A; step=0; break; default: step=0; break; } C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 break; case 7://故障:故障优先级,如果有多个故障,只报最高优先级的. //if(step1) //{ //step1=0; CAN_TxBuff[0]=0xA7; CAN_TxBuff[1]=Flash_Err; CAN_TxBuff[2]=0x00; CAN_TxBuff[3]=0x00; CAN_TxBuff[4]=0x00; CAN_TxBuff[5]=0x00; CAN_TxBuff[6]=0x00; CAN_TxBuff[7]=0x5A; C1TX0B1=CAN_TxBuff[0]+CAN_TxBuff[1]*0x100; C1TX0B2=CAN_TxBuff[2]+CAN_TxBuff[3]*0x100; C1TX0B3=CAN_TxBuff[4]+CAN_TxBuff[5]*0x100; C1TX0B4=CAN_TxBuff[6]+CAN_TxBuff[7]*0x100; C1TX0CONbits.TXREQ = 1; //启动发送 //} break; default: break; } } } void __attribute__((__interrupt__,__auto_psv__)) _C1Interrupt(void)//CAN1 { if (C1INTFbits.TX0IF) C1INTFbits.TX0IF = 0; if (C1INTFbits.TX1IF) C1INTFbits.TX1IF = 0; if (C1INTFbits.TX2IF) C1INTFbits.TX2IF = 0; if (C1INTFbits.RX0IF) { C1INTFbits.RX0IF = 0; // 添加代码,读缓冲器0 C1RX0CONbits.RXFUL = 0; } if (C1INTFbits.RX1IF) { C1INTFbits.RX1IF = 0; // 添加代码,读缓冲器1 C1RX1CONbits.RXFUL = 0; } if (C1INTFbits.WAKIF) C1INTFbits.WAKIF = 0; // 添加唤醒处理代码 if (C1INTFbits.ERRIF) C1INTFbits.ERRIF = 0; // 添加错误处理代码 if (C1INTFbits.IVRIF) C1INTFbits.IVRIF = 0; if ( (C1INTF & C1INTE) == 0 ) IFS1bits.C1IF = 0; // 在返回前清零CAN1 中断标志 } 根据这个P32F6015的CAN代码和上面步骤逻辑,转一个完整的STM32(版本V3.5.0)的CAN
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值