所有软件外包项目 Gray arrow bg 开发一个在MAC的Safari上使用的串口通讯插件

开发一个在MAC的Safari上使用的串口通讯插件

发包方 : Zhaoqw_78 状态 :竞标已取消
项目编号 : 223196
项目预算 : 竞标出价
开发周期 : 14 天
技能 : C++
发布日期 : 2017-06-19
竞标后显示联系方式

描述

1 环境要求
插件运行在MAC系统上,需要支持Safari。
2 业务流程
1) 调用LoadAllPrinter,获取本地打印机,使用结果初始化页面上的下拉列表。
2) 调用LoadAllPort,获取本地所有串口名称,使用结果初始化页面上的下拉列表。
3) 用户点击写入按钮,执行写入流程。
a) 首先使用相关参数串口的参数。
i. 开启串口
ii. 绑定发送和接收事件
b) 将页面传入的指令sendorder,调用AddOrder,tasktype类型为1。
i. 将sendorder加入Order队列。初始化任务状态
ii. 异步的将sendorder通过串口发出。
iii. 确认发送成功。
iv. 修改Order队列中的任务状态为成功
4) 页面启动定时器,定时检查任务结果。
a) 调用GetTaskStatus,获取任务状态。
i. 如果执行成功
1. 检查是否需要执行检查任务
a) 需要执行,则跳到5)。
b) 不需要执行则返回
ii. 执行失败
1. 抛出异常
iii. 执行超时
1. 抛出异常
5) 执行检查
a) 将页面传入的指令sendorder,调用AddOrder,tasktype类型为2。
b) 将sendorder加入Order队列。初始化任务状态
c) 异步读取指令信息,将读取的指令转成16进制串,同传入的Order进行比对
d) 两者一致则成功,不一致则失败。修改Order队列中的任务状态为成功
6) 页面启动定时器,定时检查任务结果。
a) 调用GetTaskStatus,获取任务状态。
i. 如果执行成功
1. 返回。
ii. 执行失败
1. 抛出异常
iii. 执行超时
1. 抛出异常

3 接口说明
3.1 获取打印机接口
函数名称:LoadAllPrinter
功能:获取本地的所有打印机名称
输入:无。
输出:将所有打印机名称以分号(”;”)分隔,给出一个字符串,最后一个打印机不添加分隔符。,例如:“PrintA;PrintB”
当前C#实现代码如下:
public string LoadAllPrinter()
{
List<string> ret = new List<string>();
foreach (string item in PrinterSettings.InstalledPrinters)
{
ret.Add(item);
}
return Utility.ToSplitString(ret.ToArray(), ";");

}

当前页面调用如下:
var obj = document.getElementById("objec");
var printers = obj.LoadAllPrinter();
var DDLPort = document.getElementById("<%=DropDownList_Printer.ClientID %>");

// 将本机端口信息,写入Cookie
setCookie("BroadOceanMotorOptions_ALLPrinterName", printers);
DDLPort.options.length = 0;
var arr = printers.split(';');
for (var i = 0, len = arr.length; i < len; i++) {
var addoption=document.createElement("option");
addoption.text = arr[i];
addoption.value = arr[i];
DDLPort.add(addoption);
}

3.2 获取本地串口接口
函数名称:LoadAllPort
功能:获取本地的所有串口名称
输入:无。
输出:将所有串口名称以分号(”;”)分隔,给出一个字符串,最后一个串口不添加分隔符。,例如:“Com1;Com2;Com4;Com6”
当前C#实现代码如下:
public string LoadAllPort()
{

return Utility.ToSplitString(SerialPort.GetPortNames(), ";");

}
当前页面JS调用如下:
var obj = document.getElementById("objec");
var printers = obj.LoadAllPrinter();
setCookie("BroadOceanMotorOptions_ALLPortName", ports);
DDLPort = document.getElementById("<%=DropDownList_COM.ClientID %>");
DDLPort.options.length = 0;
var arr = ports.split(';');
for (var i = 0, len = arr.length; i < len; i++) {
var addoption=document.createElement("option");
addoption.text = arr[i];
addoption.value = arr[i];
DDLPort.add(addoption);
}

3.3 设置本地串口接口
函数名称:SetComSetting
功能:设置本地串口打开的相关属性
输入:portname 串口名称 字符串
Rate 波特率 INT
输出:无
当前C#实现代码如下:
public int SetComSetting(string portname, int rate)
{
_portname = portname;
_rate = rate;
if (hs == null)
{
hs = new handlerSport(HandlerData);
SetSerialPort();
AddShowLog("OCXFRM SetSerialPort ");
}
return 0;
}

private void SetSerialPort()
{
serialPort1 = new SerialPort(_portname, _rate, Parity.None, 8);
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort1.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort1_ErrorReceived);
serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;

}
当前页面JS调用如下:
var obj = document.getElementById("objec");
var portname = getCookie("BroadOceanMotorOptions_PortName");
var ret = obj.SetComSetting(portname, 2400);
3.4 添加指令接口
函数名称:AddOrder
功能:向COM口添加要写入的指令
输入: SendTaskId 任务ID 字符串
Sendorder 要发送到指令 字符串
Tasktype 任务类型 INT 1:写入指令, 2:检查指令
输出:无
当前C#实现代码如下:
public int AddOrder(int taskid, string OrderHex, int ordertype)
{
AddShowLog("AddOrder Begin");
if (Serialobj.TaskTable.ContainsKey(taskid))
{
AddShowLog("AddOrder return -2");
return -2;
}
else
{
switch (ordertype)
{
case (int)OrderTypeEnum.Program:
AddShowLog("AddOrder Program");
SendWriteOrder(taskid, OrderHex);
timerSend.Enabled = true;
AddShowLog("AddOrder SendWriteOrder OK ");
break;
case (int)OrderTypeEnum.Read:
AddShowLog("AddOrder Read");
SendCheckOrder(taskid, OrderHex);
timerCheck.Enabled = true;
AddShowLog("AddOrder SendCheckOrder OK ");
break;
default:
AddShowLog("AddOrder return -1");
return -1;

}
AddShowLog("AddOrder return 0");
return 0;
}
}

当前页面JS调用如下:

function ExecPrograming() {
var obj = document.getElementById("objec");
var portname = getCookie("BroadOceanMotorOptions_PortName");
var ret = obj.SetComSetting(portname, 2400);
var tasktype = 1;

var ret = obj.AddOrder(SendTaskId, sendorder, tasktype);
printflag = false;
is_Check = true;
CheckSend = false;
setTimeout("remainTime()", 1000);
}
3.5 获取任务状态接口
函数名称:GetTaskStatus
功能:获取指定任务的状态信息
输入: TaskId 任务标识 int
输出: 任务状态 INT
public enum TaskStatusEnum
{
Success = 1,// 成功
Error = 2, // 失败
Init = 3, // 未执行
Executing = 4 // 执行中
}
当前C#实现代码如下:
public int GetTaskStatus(int taskid)
{
if (Serialobj.TaskTable.ContainsKey(taskid))
{
Order od = (Order)Serialobj.TaskTable[taskid];
return (int)od.Status;
}
else
return -1;

}

当前页面JS调用如下:
if (CheckSend) {
ret = obj.GetTaskStatus(CheckTaskId);
}
else {
ret = obj.GetTaskStatus(SendTaskId);
}
3.6 关闭任务接口
函数名称:DisposeTask
功能:关闭指定任务
输入: TaskId 任务标识 int
输出: 任务状态 INT
public enum TaskStatusEnum
{
Success = 1,// 成功
Error = 2, // 失败
Init = 3, // 未执行
Executing = 4 // 执行中
}
当前C#实现代码如下:
public void DisposeTask(int taskid)
{
if (Serialobj.TaskTable.ContainsKey(taskid))
{
Serialobj.TaskTable.Remove(taskid);
}
}

当前页面JS调用如下:

var printflag = false;
var is_Check = true;
var CheckSend = false;
var SendTaskId = "640033347";
var CheckTaskId = "640033340";
var sendorder;
function remainTime() {
if (!printflag) {
var obj = document.getElementById("objec");
var s;

var ret = -1;
if (CheckSend) {
ret = obj.GetTaskStatus(CheckTaskId);
}
else {
ret = obj.GetTaskStatus(SendTaskId);
}

if (ret == 3 || ret == 4)
setTimeout("remainTime()", 500);
else if (ret == 1) {
if (!CheckSend) {
obj.DisposeTask(SendTaskId);
PageMethods.AddProDefineLogToDT_Log("1", CheckIsSuccess);
}
else {
obj.DisposeTask(CheckTaskId);
PageMethods.AddProDefineLogToDT_Log("2", CheckIsSuccess);

}
<%-- document.getElementById("<%= ASPxButton_RefreshGrid.ClientID %>").click();--%>
if (is_Check) {
var ret = obj.AddOrder(CheckTaskId, sendorder, 2);
is_Check = false;
CheckSend = true;
setTimeout("remainTime()", 500);
}
else {
PrintBtn();
}
}
else {
if (CheckSend)
{
PageMethods.AddProDefineLogToDT_Log("4", CheckIsSuccess);
}
else {
PageMethods.AddProDefineLogToDT_Log("3", CheckIsSuccess);
}
<%-- document.getElementById("<%= ASPxButton_RefreshGrid.ClientID %>").click();--%>
alert("执行错误,错误代码【" + ret + "】");
}

}
}

交付需求:
我们希望找一个有相关开发经验的团队承接这个项目,确保在两周内完成。请您在竞标时给出具体的实施方案和报价,详细的竞标方案将有助于我与您进一步的沟通。谢谢

项目竞标

接包方 国家/地区
通过实名认证 公司中讯志远(武汉)科技有限公司通过公司认证
9
Zxzykj001
武汉市
拥有案例
5
Btm_solution
北京市
通过实名认证 拥有案例
2
Kmwwkj1
昆明市

竞标

请您先登录,然后提交此项目的竞标方案。
还不是智城用户? 智城期待您的加入,请注册成为我们的一员吧!
Project ad2