基于FPGA与GSM的医院排号系统完整硬件设计与源代码
- UID
- 863084
|
基于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() |
|
|
|
|
|