簡體   English   中英

如何從文本框上的COM端口寫入數據?C#MVC 4,剃須刀

[英]How I can write data from a COM port on a text box?, c# mvc 4, razor

您好,我是MVC 4和C#的新手

我需要從com端口讀取數據並將其自動寫入文本框中; 我正在使用C#和MVC 4剃須刀。

我有來自COM端口的數據和下一個代碼,但是我不知道如何在文本框中讀取和寫入此數據。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading.Tasks;
using System.IO.Ports;

namespace Altair.Models.Business
{
    public class ComPort
    {
        private string indata = "";
        public ComPort()
        {
            SerialPort mySerialPort = new SerialPort("COM6");

            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            mySerialPort.Close();
        }

        public string getIndata(){
            return this.indata;
        }

        private void DataReceivedHandler(
                       object sender,
                       SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            indata = sp.ReadExisting();           

        }
    }
}

而cshtml代碼是:

@model Altair.Models.IU.FacturaVentaIU

@{
    ViewBag.Title = "Altair";
}

<h2>BienVenido</h2>

@if (ViewBag.registroFallido != null)
{
    @ViewBag.registroFallido
}
<h3>Por favor registre la tarjeta</h3>
@using (Html.BeginForm("registroCodigoTargeta", "Registro", FormMethod.Post))
{
    @Html.AntiForgeryToken() //Pra prevenir ataques CSRF
    @Html.ValidationSummary(true)

    <table>
        <tr>
            <td>@Html.LabelFor(a => a.codigoTarjeta)</td>
            <td>@Html.TextBoxFor(a => a.codigoTarjeta)</td>
            <td>@Html.ValidationMessageFor(a => a.codigoTarjeta)</td>
        </tr>

        <tr>
            <td><input type="submit" value="Generar Factura" /></td>
            <td><input type="reset" value="Limpiar" /></td>
        </tr>
    </table>
}

非常感謝您的幫助。

這個問題實際上有兩點:

在基於MCV請求的系統中處理“流式”數據

首先,您需要以某種方式緩沖COM輸入,以使其在多個請求中持久存在。 一種簡單的想法是使您的COM類靜態化,在需要時(例如,在站點啟動時)構造它,並像當前一樣在類中緩沖/累積數據。 您將需要閱讀mvc.net中長時間運行的/ 后台任務,因為該框架主要基於請求 ,因此這些任務並非一帆風順。

緩沖完COM數據並准備好進行讀取后,就可以將其放入頁面了。 如果只需要按頁面加載時的原樣顯示數據,這很簡單:在控制器操作中,獲取最新數據,將其寫入視圖模型,然后根據需要使該視圖呈現此屬性的文本框。

動態更新您的頁面

如果您需要文本框實時更新(或接近它),因為數據將出現在COM端口上,則您需要做更多的工作。 首先,考慮是否確實需要這樣做,因為通常越簡單越好。 如果確實需要在頁面上動態刷新/更新這些數據,則可以使用多種選擇:

  • 定期刷新整個頁面。

使用JavaScript計時器定期刷新整個頁面。 每次您處理請求時,您的控制器操作都會獲取最新的緩沖com數據,並將其傳遞給視圖以重新呈現整個頁面。

這是最微妙的方法,如果其他元素需要保留/捕獲用戶輸入等,則可能不適合。但是,它實現起來非常簡單,並且可能會很快給您帶來收益。

  • 使用AJAX僅刷新require元素

添加一個新操作(可能在API控制器中 ),該操作僅以JSON,XML等形式返回COM數據。 使用頁面中的javascript對此API端點進行定期AJAX請求,以獲取最新數據,然后更新文本框內容。

這實現起來非常簡單,非常漂亮並且具有模塊化,並且可以根據需要提供良好的響應能力,您可以調整刷新周期以平衡服務器上的負載與頁面的響應能力。

  • 使用SingalR獲取“實時”更新。

如果您擔心數據是最新的,則可以考慮使用SingnalR來實現與AJAX選項相同的功能。 區別在於,您可以將通信推遲到SingalR庫,而不是通過AJAX定期輪詢。 SignalR使用可用的任何技術透明地為您提供“推動”功能。 在這種情況下,這意味着更新com數據時,用於更新文本框的JavaScript代碼會從服務器端調用/推送一個事件。

這是最繁瑣的工作,需要您在服務器端編寫SignalR Hub。 然后,您需要獲取COM處理代碼,以便在收到新數據時調用您定義的任何SignalR消息,從而使該數據傳遞給任何連接的客戶端(打開您網頁的任何人)。 一旦收到更新,此調用將觸發文本框為連接的每個人更新。

這種方法反應迅速,但是需要最多的工作。 對於您的真正需求,它可能過度設計。 這樣的事情真正令人矚目的地方是您擁有多個相互連接的系統,並且您希望從一個系統實時更新到另一個系統。 由於還有一個C#(以及javascript)的SignalR客戶端庫,因此您可以觸發和接收實時事件,這些事件在不同平台或組件之間共享。

實際上,這可能會為您提供不同的體系結構選擇 :您可以創建一個小型控制台應用程序或Windows服務,就像您當前的代碼一樣,它偵聽COM端口。 該代碼可以連接到SingalR集線器(托管在MVC應用程序中),並在COM數據更改時通過集線器推送更新。 然后,您的SignalR Javascript客戶端(在網頁上)可以訂閱此消息,如之前的方法一樣。

這樣做的好處是可以將持久性/長期運行的代碼與MVC應用程序分開。 實際上,對於正在使用的產品,我們實際上使用了與此類似的方法。 我們有一個Windows服務,該服務會定期檢查一堆東西並記錄它們的狀態。 然后,它通過MVC網站中托管的SignalR集線器調出新的狀態信息。 我們在一個大屏幕上有一個監控網頁,該網頁通過signalR接收這些消息,然后更新其顯示以顯示最新狀態信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM