便携式打印数据中心的软件设计(一):数据采集之串口通讯软件设计说明

in #undefined6 years ago

之前由于客户需求,专门设计了针对便携式仪表使用的数据打印机,受这个启发,我认为我们自己的产品,比如一些数据记录仪(Datalogger),也可以使用打印机打印出统计数据,以便用户现场就能够看到阶段性统计结果,而无需使用 PC下载。
image.png

本文先讨论该系统的数据采集工作,也就是打印中心从配套的数据记录仪通过RS232接口下载数据的过程。

RS232 module主要包括rs232.c(串行通讯与数据处理),realtime.c, iic.c(EEPROM读写),基本定时器的设置四个子程序。

程序的主体是rs232.c,其余是芯片的底层驱动。下面重点说明rs232.c:流程图中所用到的变量介绍请参见附件的的变量说明表。

一.串行通讯:

Datalogger printer(以下简称printer)上电后,即进行Datalogger 的在线检测,每隔3S左右发送一次I,如接收正常,则发送M,读取一些Datalogger的基本信息。然后根据key_lcd.c产生的各个控制字进行相应的操做。

因为使用的CPU为MSP430F135,它自带串口通讯模块,因此CPU的串口工作时主要由USART模块控制,但也要做一定的判断。在发送数据之前,先判断引脚电平15mS左右,如无变化(为高电平),再发送数据,否则CPU工作会不正常。若为低电平,则offline。

MSP430F135的datasheet上给的9600 bps的控制字误差偏大,现自己计算,过程及对照表如下:
image.png
表一 MSP430 Baud Rate计算

1》数据发送中断的处理:

因为Datalogger的信息接收脚RX和信息发送脚TX连接在一起,采用的是半双工的串口通讯方式,Printer也是如此。所以当Printer发送数据时,接收脚要置为高阻态,即输入状态,以免影响数据电平;同理,在Printer接收数据时,发送脚也要作相同处理。

由此产生一个问题,即当发送完毕之后,需要过多久再把发送脚置为高阻,接收脚置为模块输入。如果切换早了,则信息还没有发送完毕,若切换晚了,则会漏接收。

又因为程序分为三个模块,最好不要在某一个程序模块停留太久。所以采用中断发射数据,无需再多加判断。现在在正常数据发送完成后,再加发一个线路空闲字节(线路上为高电平),之后立即切换引脚,则被切换引脚所破坏的讯号为附加的这个线路空闲字节,正常信息没被破坏,而且也不影响接收数据。流程如下:
image.png
图一 发射中断流程

2》数据接收中断的处理:

Datalogger数据格式以回车为一帧数据的结束。串口中断接收程序是较为底层的一块,为简化上层记录数据处理的步骤,现将接收到的记录数据数组直接在中断程序中转为INT型的数据。

目前有3种Datalogger,8828发送记录数据每两帧之间空闲时间为4mS左右,8829为7mS左右,8818为6mS左右,而中断程序中数据转换最长时间不超过1.3mS,因此不会影响接收数据。

其程序流程图如下:
image.png
图二 接收中断流程

在Download数据时,Datalogger会回应一次关于M的信息,是Download时最新的记录数据个数的状况,同样为简化上层程序的入口判断,现在中断中更新Total。


二. RS232 module的主体结构:

其具体流程如下:
image.png
图三 RS232主体流程

发送控制信息的主要工作就是数据格式转换,详情请参见程序。下面是部分程序截图:
image.png

当进行报警值设定时,8828,8829,88128都是发送(温度值×10),而8818则是发送对应的电阻值,详情请参阅CommandsOfDataLogger.doc。为减小ROM空间,将8818所用到的电阻表格的一部分放到信息FLASH中(256字节)。这个表格若放入EEPROM中,则数据处理速度太慢。
image.png
图四 接受判断处理

注:其中小模块的流程参见附录。


附录:

image.png
表二 变量说明

Datalogger 记录信息接收:
image.png

Datalogger 记录数据接收:
image.png


之前因为详细讲述过打印功能原理,这里就不展开了,附上简要说明:

打印头驱动信号:
HOME信号,TG信号,MOTOR控制信号,打印头控制信号。

  • HOME信号检测:
    HOME信号经过HC14整形反相后,输入到单片机,打印头到位HOME时为L,离位时为H。HOME到位检测过程为:HOME信号发生H→L时,启动1.5ms定时器,每1.5ms对HOME采样一次,如果连续3次HOME都为L,则打印头到位。HOME离位检测过程为:在HOME到位状态下,HOME发生L→H,则打印头离位。

  • TG信号检测:
    TG信号经过HC14整形反相后,输入到单片机,每次TG发生H→L就会触发一次中断。在连续打印时,为了保证上下行对齐,采用TG计数的方法来定位打印头位置,而不采用HOME信号(MTP201-166G每行TG为276)。

  • Printer Driver接口
    指定打印缓冲区
    #define PRINTBUF_MAX 30

打印状态字uchar PrintStatus
正在打印时,PrintStatus =PRINT_BUSY
打印完成时,PrintStatus =PRINT_DONE
准备打印下一行时,PrintStatus =PRINT_NEXT_RDY

打印命令字uchar PrintCommand
启动打印, PrintCommand =PRINT_START
取消当前打印行,PrintCommand=PRINT_CANCEL

打印模式设定uchar PrintModeSet
文本 ,PrintModeSet =PRINT_TEXT
曲线,PrintModeSet =PRINT_LINE
图形,PrintModeSet =PRINT_GRAPHIC

打印数据类型char PrintDataType
温度,PrintDataType=PRINT_DATA_T
温度和湿度,PrintDataType =PRINT_DATA_T_RH

打印意外标志uchar PrintException
当PrintException=1时,取消当前所有打印,并且打印头复位。

打印加热延时uint PrintDelay
用来调节打印的浓度。

void PrintDrvInit(void);
打印驱动模块初始化函数。
uchar PrintPutChar(const uchar* pbuf,uchar len);
把长度为len的字符串pbuf放入打印缓冲区。

uchar PrintPutAChar(uchar buf);
把字符buf放入打印缓冲区。

void PrintBufFlush(void);
清空打印缓冲区。

void PrintDrvRoutine(void);
打印驱动例程,每次设定命令后,至少要执行一次此函数,命令才会有效。

void PrintPutTextStr(uchar* pText);
把字符串pText放入打印缓冲区。

void PaperJamDeal(void);
卡纸处理。

  • Print Out 接口
    void PrintGraphic(void);
    打印曲线图例程。

void PrintInit(void);
打印初始化函数。

void PrintRoutine(void);
打印命令处理例程。

void PrintSummary(void);
打印Datalogger预览例程。

void PrintTextTable(void);
打印文本列表例程。

void prn_interface(void);
打印接口数据处理函数。


以上就是数据接收部分的详细论述,以及 简单的打印模块软件说明,下次将主要讲述按键/显示模块的处理。


以上内容均由 @patriciaphilip原创,如无授权,请勿引用,谢谢!


Posted from my blog with SteemPress : http://cnstm.org/blog/2019/05/18/%e4%be%bf%e6%90%ba%e5%bc%8f%e6%89%93%e5%8d%b0%e6%95%b0%e6%8d%ae%e4%b8%ad%e5%bf%83%e7%9a%84%e8%bd%af%e4%bb%b6%e8%ae%be%e8%ae%a1%ef%bc%88%e4%b8%80%ef%bc%89%ef%bc%9a%e6%95%b0%e6%8d%ae%e9%87%87%e9%9b%86/

Sort:  



This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie and @utopian-io.

If you appreciate the work we are doing, then consider supporting our witness stem.witness. Additional witness support to the curie witness and utopian-io witness would be appreciated as well.

For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!

Please consider setting @steemstem as a beneficiary to your post to get a stronger support.

Please consider using the steemstem.io app to get a stronger support.

Congratulations @patriciaphilip! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You received more than 3000 upvotes. Your next target is to reach 4000 upvotes.

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

New japanese speaking community Steem Meetup badge
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Hi @patriciaphilip!

Your post was upvoted by Utopian.io in cooperation with @steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.

Contribute to Open Source with utopian.io

Learn how to contribute on our website and join the new open source economy.

Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV