POS消費交易的编程笔记

《一个菜鸟应用软件工程师的成长故事》(5)

通过将近一个多月的努力,终于在今天完成了一个不算很完整的POS消费交易工程。在这段时间里,我学习到了很多东西,也遇到过很多问题。幸运的是,绝大部分问题都已经被解决了,没解决的问题,我也会继续努力搞定。

越是深入学习开发应用程序,对于编程知识的要求就越是细化。没事多看看书,是很有必要的。编程语言一直在发展,我们的知识也要及时更新,否则,落后就要被淘汰!

下面是我的后续工作笔记。

-----------------------------------
日期:2012/9/19,周三
时间:下午14点20分
地点:公司
事件:修改程序(Magnetic)
-----------------------------------
1.要特别注意,打印机的开启与关闭是否有冲突,这能导致POS

机重启。
2.创建加密区之后,要记得释放加密区所占的内存空间
-----------------------------------
日期:2012/9/20,周四
时间:上午10点18分
地点:公司
事件:修改程序(Schemes)
-----------------------------------
1.写任何的程序,注释都很重要。
2.密码加密要用到schems里的.SGN文件,要记得加进工程里。
-----------------------------------
日期:2012/9/21,周五
时间:下午15点34分
地点:公司
事件:修改工程(trainone)编译环境
-----------------------------------
1.系统函数库里的.cpp函数不要加进工程里,暂时还用不到,如

果加进去了,而引用不当,会造成很多错误的,编译不能通过。
2.引用函数的前提是,函数已经被声明和定义,否则会出现错误

。声明函数,只是告诉编译器这个函数的存在,要准备给它预留

一点空间,只有定义之后,编译器才会为函数预留出一片内存空

间,只有在主函数调用这个函数之后,那片内存空间才真正属于

这个函数。
3.如果不先声明函数,而直接定义函数,有可能会因为内存空间

不足而导致系统崩溃。所以,良好的习惯是,先声明函数,再定

义函数。
-----------------------------------
日期:2012/9/24,周一
时间:下午15点36分
地点:公司
事件:修改程序(Schemes)
-----------------------------------
1.密码键盘IPP220的代号是IPP2XX。
2.逻辑的错误最难修正,
-----------------------------------
日期:2012/9/25,周二
时间:下午14点13分
地点:公司
事件:修改程序(Input)
-----------------------------------
1.可以通过调用SHOWMENU函数来解决金额输入的问题。
2.给不同类型的变量赋值要强制转换类型。
-----------------------------------
日期:2012/9/26,周三
时间:上午11点33分
地点:公司
事件:修改程序(Magnetic)
-----------------------------------
1.选择编译方式的时候,最好选择重编译(rebuild),因为如果

只编译当前工程的话,可能会导致一些修改没能被编译进工程里

。重编译虽然慢了些,但保证修改的有效性。
2.算法的优化可以留着工程完成之后再进行。
-----------------------------------
日期:2012/9/27,周四
时间:上午11点30分
地点:公司
事件:修改程序(Schemes)
-----------------------------------
1.数组的拷贝可以用系统函数来实现。
2.字符和字节的转换,要考虑好所有情况。
-----------------------------------
日期:2012/9/28,周五
时间:下午15点25分
地点:公司
事件:修改程序(FMG)
-----------------------------------
1.在IAC里用SEVICESCALL调用USER2。
2.用SIZEOF计算长度的时候,要注意,字符末尾还存在一个

NULL终止符。
3.要想使多个源文件能用同一个结构体,那么就要在头文件里声

明结构体,在一个源文件中定义变量,其他源文件在使用结构体

变量前,得在变量前加关键字extern来定义变量,如此,才能正

确引用。
比如,在A.C源文件里定义了结构变量ST.AO,那么其他源文件

要引用CAO,则需定义exetern  ST.CAO;当然,不乏其他方法,

待以后研究。
-----------------------------------
日期:2012/10/09,周二
时间:下午15点05分
地点:公司
事件:修改程序(FMG)
-----------------------------------
1.字符串数组的赋值可以有几种方式。
比如:在定义的时候初始化,char a[20]="hello";
或者char a[20]={'h','e','l','l','o',};
由于终止符'/0'的存在,字符串数组的大小要比它存储的字符串长

度大1.
2.unsigned long类型变量在输出时,其格式转换说明符为lu,而

long int则为ld。
-----------------------------------
日期:2012/10/10,周三
时间:下午15点17分
地点:公司
事件:修改程序(FMG)
-----------------------------------
1.在给字符串数组赋值时,要注意字符串数组的大小是否足够,

如果不够,则会造成溢出错误。
2.打印字符串数组的全部内容时,不用FOR循环,直接使用打印

函数即可。
3.数字字符串转化为整数输出的函数是atoi。
-----------------------------------
日期:2012/10/12,周五
时间:下午14点17分
地点:公司
事件:修改程序(IAC)
-----------------------------------
1.驱动人生不如驱动精灵好用。
-----------------------------------
日期:2012/10/15,周一
时间:上午10点30分
地点:公司
事件:调试程序(ComSerial)
-----------------------------------
1.系统函数库的添加一定要慎重,引用不当会造成某些程序段无

法正常执行。
2.Source Insight这款软件的使用,界面很清晰,有很好的全局观

,Ctrl+.或者Ctrl+,是执行步骤向前或向后,Ctrl+Shift+F是查找。
-----------------------------------
日期:2012/10/16,周二
时间:下午17点37分
地点:公司
事件:调试程序(FMG)
-----------------------------------
1.重打印和查询交易虽然内容差不多,但不是一个概念。
-----------------------------------
日期:2012/10/17,周三
时间:下午19点27分
地点:公司
事件:调试程序(FMG)
-----------------------------------
1.交易汇总的数据应该在一个函数中设为变量,然后循环读取

BATCH里面存取的交易信息,计算交易汇总量,再显示出来。
-----------------------------------
日期:2012/10/18,周四
时间:下午20点31分
地点:公司
事件:调试程序(FMG)
-----------------------------------
1.键盘和磁道的开关,一定要注意,操作不当,会导致机器重启
2.待机界面可以直接刷卡,后台会自动处理,需要进入EMV的一

个函数里进行卡的参数提取与传递。
-----------------------------------
日期:2012/10/19,周五
时间:上午11点36分
地点:公司
事件:调试工程(trainone)
-----------------------------------
1.预编译头文件只能解决同一个头文件被同一个源文件多次包含

的问题,不能解决多个源文件包含同一个头文件的问题。
2.字节只以八进制的形式在调试窗口里显示,要想看十六进制的

形态,要点进相应数组的元素里才能查看。
-----------------------------------
日期:2012/10/22,周一
时间:下午19点10分
地点:公司
事件:调试程序(FMG)
-----------------------------------
1.数组名可以用作指针,但不能作为左值,因为它是常量。
2.假如int *i;则i++表示指针向前移了一位,*i++则表示i指向的值加

1。此外,指针不能相加。
3.MAC的计算函数参数里,数组的长度值要是8的倍数。
-----------------------------------
日期:2012/10/25,周四
时间:下午16点23分
地点:公司
事件:调试工程(Trainone)
-----------------------------------
1.假如结构体成员是一个字节数组,那么,在一个函数中用它给

另外一个局部变量(字节数组)赋值的过程中,很有可能会造成

数据丢失,赋值不准确。造成这样情况的原因,还未知晓。
2.通过IAC,用SeviceCall调用user2进行数据打印。
-----------------------------------
日期:2012/10/26,周五
时间:上午11点18分
地点:公司
事件:调试工程(Trainone)
-----------------------------------
1.在打印很多数据的时候,等待时间应该稍微长一些,以保证所

有需要打印的数据都能打印出来。
2.结构体变量初始化之后,通过该变量引用的结构体成员都被初

始化。假如有一个结构体AA,定义结构体变量 AA  a,初始化该

变量即可用memset(&a,0,sizeof(AA));
-----------------------------------
日期:2012/10/29,周一
时间:下午16点48分
地点:公司
事件:调试工程(Trainone)
-----------------------------------
1.串口通信和以太网的通信过程差不多,前者要求对发送数据进

行一些与串口有关的处理,比如填加02...03和校验码,而后者则

要求添加数据段的长度位。
2.MAC校验的前提是双方都用同一组密钥,并且安全级别相同。

原文地址:https://www.cnblogs.com/miyosan/p/2745109.html