首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于FPGA与GSM的医院排号系统完整硬件设计与源代码

基于FPGA与GSM的医院排号系统完整硬件设计与源代码

时间等于金钱。随着科技的不断发展,人们越来越追求高效率,讨厌把时间花在一些排队的事情上。电子信息技术的发展,改变了原始呆板固化的排队等候方式,转变为基于FPGA和GSM排号系统的舒适、休闲的等候方式,人们不仅可以自由安排等待时间,而且可以轻松的享受其他服务,这方式不仅提高了业务员的工作效率,也提高了其业务素质。以下详细介绍了我们这个系统的设计。

一、设计目的与要求
目的:建设了一套由FPGA、微机与GSM模块的通信系统,基于此种架设的系统来实现远程的排队叫号。在一定条件下由系统向指定号码发送请求,再由FPGA处理请求,在适宜时间协助服务提供者完成服务项目。在此过程中,FPGA为该系统的主要中心,GSM协助其实现功能。

要求:
1、患者向护士提交个人手机号码,护士给予患者相关排号的号码(例如号码是10号)。(扩展:患者不用去医院护士站利用网络也能提前提交申请服务,即提前叫号)。

2、护士将登记的患者手机号码输入微机系统,完成排号登记。

3、医生每完成一个患者的服务后,护士就点击相关按钮。系统自动完成以下任务:

若下一个患者是第7号,则系统利用语音和LCD显示屏提示第7号患者前来服务。同时GSM发送相关信息给第10号患者,提醒其做好准备。(具体是否安排第10或第11号患者,可由系统设定)。

二、系统方案与框图

从电脑输入患者的手机号码,数据通过串口经电平转换,传给FPGA,然后由FPGA储存到存储器,FPGA返回患者一个排号给电脑;当医生接诊完一个病人后,按一下next按钮,FPGA控制LED点阵显示滚动消息,提示某某号病人前去就诊,同时控制语音模块和喇叭通知这位病人,并且读取储存器中的数据送到GSM短信模块,使其发短信通知后面正在等待的某位病人做好准备。系统框图如下:




四、模块设计
1、PC与FPGA通信
PC方面,利用Visual C++ 6.0创建一个MFC应用程序,加入MSComm控件,在应用程序框架中添加要实现的功能的代码,设置合适的参数,即可实现串口通信。首先用MFC AppWizard(exe)建立一个基于对话框的应用程序界面,添加所需控件,设置控件ID,接着用“建立类导向”建立各个控件的函数。结果如下图所示:


然后为上图中的各个控件添加变量,结果如下图:


在VC++生成的应用程序框架下添加串口初始化函数的代码:
BOOL CPC_FPGADlg::OnInitDialog()
{
       CDialog::OnInitDialog();  // Add "About..." menu item to system menu.
       // IDM_ABOUTBOX must be in the system command range.
       ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
       ASSERT(IDM_ABOUTBOX < 0xF000);
       CMenu* pSysMenu = GetSystemMenu(FALSE);
       if (pSysMenu != NULL)
       {
              CString strAboutMenu;
              strAboutMenu.LoadString(IDS_ABOUTBOX);
              if (!strAboutMenu.IsEmpty())
              {
pSysMenu->AppendMenu(MF_SEPARATOR);   SysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
              }
       }
       // Set the icon for this dialog.  The framework does this automatically
       //  when the application's main window is not a dialog
       SetIcon(m_hIcon, TRUE);                    // Set big icon
       SetIcon(m_hIcon, FALSE);            // Set small icon
              // TODO: Add extra initialization here  //以上是VC++自动生成的代码
       if(m_ctrlComm.GetPortOpen())//如果串口已经打开
              m_ctrlComm.SetPortOpen(FALSE);//不再重新打开
              m_ctrlComm.SetCommPort(1); //选择COM1口
       if( !m_ctrlComm.GetPortOpen())//如果串口没打开
              m_ctrlComm.SetPortOpen(TRUE);//打开串口
       else
              AfxMessageBox("无法打开串口!");//弹出提示消息
       m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验位,8个数据位,1个停止位
       m_ctrlComm.SetInputMode(1); //“1”表示以二进制方式接收数据
       m_ctrlComm.SetRThreshold(1); //“1”表示每当接收接收到一个字节时将引发一个接收数据的OnComm事件
       m_ctrlComm.SetInputLen(0); //“0”表示设置读取缓冲区全部数据
m_ctrlComm.GetInput();//初始化时读缓冲区以清除数据
       return TRUE;  // return TRUE  unless you set the focus to a control
}

下面是产生OnComm事件后接收数据的代码:
void CFC_FPGADlg::OnComm()
{
       // TODO: Add your control notification handler code here
       m_strPaihao=" ";
       VARIANT variant_inp;//定义VARIANT型变量
    COleSafeArray safearray_inp;//定义COleSafeArray类实例
    LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
    CString strtemp;//临时变量
    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
    variant_inp=m_ctrlComm.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
        for(k=0;k<len;k++)
            safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
        for(k=0;k<len;k++) //将数组转换为Cstring型变量
        {
            BYTE bt=*(char*)(rxdata+k); //字符型
            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
            m_strPaihao=m_strPaihao+strtemp; //在编辑框显示排号
        }
    }
    UpdateData(FALSE); //更新编辑框内容
}

“确定” 按钮的实现代码:
void CPC_FPGADlg::OnOK()
{
       // TODO: Add your control notification handler code here
       m_strComm.SetOutput(COleVariant(m_strNum));//发送手机号
}

“清除”按钮的实现代码:
void CPC_FPGADlg::OnClear()
{
       // TODO: Add your control notification handler code here
       m_strNum = _T("");//清除手机号
m_strPaihao = _T("");//清除排号

}
BEGIN_EVENTSINK_MAP(CPC_FPGADlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CPC_FPGADlg)
ON_EVENT(CPC_FPGADlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnComm, VTS_NONE)
       //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
返回列表