基于MSC1210单片机的串口通讯设计 点击:428 | 回复:0



sinap_zhj

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 1回
  • 年度积分:0
  • 历史总积分:184
  • 注册:2014年7月31日
发表于:2014-11-12 19:21:40
楼主

微控制器MSC 1210是美国德克萨斯仪器公司最近推出的一种16位单片机,其集成了嵌入式的24位高精度∑-△A/D转换器,可以容易地实现单片式低噪声高精度数据采集系统。MSC 1210具有速度快、处理能力强、可靠性高、功耗低、功能强大等优点。与目前常用的8位微控制器相比 ,其片内资源极其丰富,适应于各种控制场合;内部集成度高,硬件可靠性和稳定性强,外部扩展工作少,开发周期短。
微控制器MSC1210是TI推出的一种集模拟、数字、闪速存储器于一体的高性能微控制系统。其应用范围十分广泛。使用增强的数字处理内核和高速闪存并带有高性能模拟和外围部件,可以实现优越的系统性能。MSC1210具有以下主要特性:片上温度传感器;24位无遗失代码;22位有效分辨率,噪声低达75nV;8通道差动/单端模拟输入;3个16位的定时器,16位PWM波输出; 多达21个中断源,34个I/O管脚;32个数字输入/输出端口,带有看门狗;8路ADC提供24位分辨率可编程的无丢失码解决方案;可编程增益放大(PGA)在1~128之间可调,极大提高了ADC精度;供电电源2.7~5.25 V,在3 V时功耗低于4 mW,停止方式电流小于100nA;内核兼容8051,指令与8051完全兼容,可以使用原有8051开发系统;时钟频率可达30 MHz,单指令周期133nS,执行速度比标准8051快3倍;高达32 KB的Flash存储器,SRAM达1.2 KB,外部可扩展至64 KB存储器;Flash在电压低达2.7 V时仍可串行或并行编程,可10万次擦除/写操作; 具有32位累加器, 有电源管理功能,能够进行低电压检测,在片上电复位;带FIFO的SPI端口;微控制器MSC1210的硬件和引脚完全兼容,给控制系统的开发设计和应用带来了很大的灵活性,通过串行通讯接口可组成由单片机与上位机PC机组成的分布式数据采集和控制系统。
串口通讯的实现
串行通讯是计算机与其他机器之间通讯的一种常用方法,在Windows操作系统中提供了实现了各种串行通讯的API函数。通常可按以下步骤实现串行通讯:打开串口、设置串口、监视串口事件、发送数据、接收数据和关闭串口。
1 打开串口
将串口设备作为文件以独占方式打开。
        m_hComm = CreateFile(" \\\\.\\COM1", 
                GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
                FILE_FLAG_OVERLAPPED, NULL);
        if (m_hComm == INVALID_HANDLE_VALUE) 
        {
                // 打开串口失败
        }
2 设置串口
在Windows的SDK中定义了一个DCB结构,其中的成员是对串口设备的设置,常用的有以下几个:
DWORD BaudRate;     // 波特率
DWORD fParity;       // 奇偶校验
BYTE ByteSize;       // 字节长度
BYTE StopBits;       // 停止位
实例:
        if (!GetCommState(m_hComm, &m_dcb))
        {
                // 获取串口设置失败
        }
        m_dcb.BaudRate = lBaudRate;
        m_dcb.ByteSize = cByteSize;
        m_dcb.Parity   = cParity;
        m_dcb.StopBits = cStopBits;
        if (!SetCommState(m_hComm, &m_dcb))
        {
                // 设置串口失败
        }
3 监视串口事件
开辟一个监视线程循环监测串口事件的发生,当有事件发生时,发送相应的消息。
OVERLAPPED os;
ZeroMemory(&os, sizeof(OVERLAPPED));
PurgeComm(m_hComm, PURGE_RXCLEAR | 
PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
while (m_hComm != NULL)
{
        dwEvtMask = 0;
        ClearCommError(m_hComm, &dwErroRFlags, &ComStat);
        if (!WaitCommEvent(m_hComm, &dwEvtMask, &os))
        {
                if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
                {
                        SendMessage(m_hWnd, WM_SERIAL_READ, 
(WPARAM) 0, (LPARAM) &pSerialComm->m_nPort);
                }
        }
        WaitForSingleObject(m_hEvent, 50);
}
4 发送数据
WriteFile(m_hComm, pBuffer, dwLength, &dwBytesWritten, &os);
5 接收数据
ReadFile(m_hComm, pBuffer, dwBytesRead, &dwBytesRead, &os);
6 关闭串口
SetCommMask(m_hComm, 0);
// 停止发送和接收数据,并清除发送和接收缓冲区
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | 
PURGE_TXCLEAR | PURGE_RXCLEAR);
CloseHandle(m_hComm);
m_hComm = NULL;

本文利用Windows API实现了上位机(PC)和下位机(MSC1210)的串行通讯。上述代码均通过调试,并投入实际应用。该通讯方法可应用于分布式数据采集和控制系统中。



热门招聘
相关主题

官方公众号

智造工程师