當前位置:首頁 » 操作系統 » sendto源碼

sendto源碼

發布時間: 2022-05-14 10:52:00

❶ c#代碼不懂

public void SendToOne(User user,string str)//發送一條信息給user這條信息是str,這是一個函數,還沒調用呢
{
try{
user.sw.WriteLine(str);不懂//user顯示這條信息
user.sw.Flush();不懂,為什麼要刷新//當然要刷新了
SetListBox(string.Format("向{0}發送{1}",user.userName,str));
向0發送一是干嗎,string.Format是什麼?//這個樓主基礎太差,0指user.userName,1指str,
}
catch
{
SetListBox(string.Format("向{0}發送信息失敗",user.userName));//如果錯誤提示..

}

}

SendToOne(gameTable.gamePlayer[i].user,str);怎麼又調用sendtoone了,循環是干嗎的啊
//這是第一次調用哦。前面不過是個函數體,聲明而已,干嗎用?當然是把信息發送給gameTable.gamePlayer[i].user

public void SendToAll(System.Collections.Generic.List<User>userList,string str)函數參數看著暈倒啊
//sendtoall,你就應該知道這個函數是向所有玩家發送消息了,哎,樓主基礎啊

❷ 我用jquery非同步輸出php文件中echo出的html代碼,火狐瀏覽器和谷歌瀏覽器不經過編譯直接輸出html源碼

你可以把你後台取到的變數數據echo出來,把html代碼拼接的部分放到前台。

如果你一定要在後台這樣拼接的話可以用<<< eof

例如這樣:

❸ 為什麼linux中sendto函數中的msg.msg

內核中定義的sys_sendto的源碼嗎?
這個屬於sendmsg中struct msghdr的用法問題, sys_sendto函數最終調用的是sock_sendmsg
int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
而用戶空間的函數sendmsg是直接調用的內核中的sock_sendmsg,
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
這兩個函數同時支持tcp和udp , 當然還有別的像unix域等。

struct msghdr
{
void *msg_name; /* Address to send to/receive from. */
socklen_t msg_namelen; /* Length of address data. */

struct iovec *msg_iov; /* Vector of data to send/receive into. */
size_t msg_iovlen; /* Number of elements in the vector. */

void *msg_control; /* Ancillary data (eg BSD filedesc passing). */
size_t msg_controllen; /* Ancillary data buffer length.
!! The type should be socklen_t but the
definition of the kernel is incompatible
with this. */

int msg_flags; /* Flags on received message. */
};

其中struct iovec的定義
struct iovec
{
void *iov_base; /* Pointer to data. */ //用戶sendto中的ptr就是賦值到此
size_t iov_len; /* Length of data. */ //用戶sendto中的長度就是賦值到此
};

不知道LZ知不知道writev函數,一次能從多個指針的地方寫入數據。
msg.msg_iovlen = 1就是指msg.msg_iov的指針指向的地方只有一個struct iovec結構體。
sendto一次只能從一個ptr發送長度為len的東西,故只用定義一個struct iovec iov[1];
msg_iovlen就是指struct iovec的個數。

例子:
如果你想用sendmsg發送ptr1 , len1 ; ptr2, len2的數據。 傳統做法是將ptr1 和 ptr2的數據都拷貝到一起。
如 char *ptr = (char*)malloc(len1 + len2);
memcpy(ptr , ptr1 , len1) ; memcpy(ptr , ptr2 , len2)
然後用sendto(sockfd , ptr , len1 + len2, 0 , addr , addrlen);

現在用sendmsg就不用拷貝。如下:
struct msghdr msg;
struct iovec iov[2];
iov[0].iov_base = ptr1;
iov[0].iov_len = len1;
iov[1].iov_base = ptr2;
iov[1].iov_len = len2;
memset(&msg , 0 , sizeof(msg));
msg.msg_name = &addr; //tcp 時為NULL
msg.msg_namelen = sizeof(addr); //tcp時為0
msg.msg_iov = iov;
msg.msg_iovlen = 2 ; //!!!!!此處為2!
sendmsg(sockfd , &msg , 0);
//這樣就不省了拷貝數據的開鎖!

python 2.7中有沒有socketserver這個模塊

Python提供了兩個基本的socket模塊。一個是socket,它提供了標準的BSD Socket API;另一個是socketServer,它提供了伺服器中心類,可以簡化網路伺服器的開發。
本文簡要介紹socket模塊包含的類及其使用。
1.開始了解socket模塊前,先熟悉下Python的網路編程模塊主要支持的兩種Intent協議:TCP和UDP。TCP協議是一種面向連接的可靠協議,用於建立機器之間的雙向通信流。UDP協議是一種較低級別的、以數據包為基礎的協議(無連接傳輸模式)。與TCP不同,UDP信息不可靠。
他們的區別如下圖所示:左圖為TCP連接協議,右圖為UDP連接協議

2.socket模塊的部分類方法介紹

類方法

說明

socket.socket(family, type[,proto])

創建並返回一個新的 socket對象

socket.getfqdn(name)

將使用點號分隔的 IP地址字元串轉換成一個完整的域名

socket.gethostbyname(hostname)

將主機名解析為一個使用點號分隔的 IP地址字元串

socket.gethostbyname_ex(name)

它返回一個包含三個元素的元組,從左到右分別是給定地址的主要的主機名、同一IP地址的可選的主機名的一個列表、關於同一主機的同一介面的其它IP地址的一個列表(列表可能都是空的)。

socket.gethostbyaddr(address)

作用與gethostbyname_ex相同,只是你提供給它的參數是一個IP地址字元串

Socket.getservbyname(service,protocol)

它要求一個服務名(如'telnet'或'ftp')和一個協議(如'tcp'或'udp'),返回服務所使用的埠號

socket.fromfd(fd, family, type)

從現有的文件描述符創建一個 socket對象

3.socket對象的部分方法介紹

實例方法

說明

sock.bind( (adrs, port) )

將 socket綁定到一個地址和埠上

sock.accept()

返回一個客戶機 socket(帶有客戶機端的地址信息)

sock.listen(backlog)

將 socket設置成監聽模式,能夠監聽 backlog 外來的連接請求

sock.connect( (adrs, port) )

將 socket連接到定義的主機和埠上

sock.recv( buflen[, flags] )

從 socket中接收數據,最多 buflen 個字元

sock.recvfrom( buflen[, flags] )

從 socket中接收數據,最多 buflen 個字元,同時返回數據來源的遠程主機和埠號

sock.send( data[, flags] )

通過 socket發送數據

sock.sendto( data[, flags], addr )

通過 socket發送數據

sock.close()

關閉 socket

sock.getsockopt( lvl, optname )

獲得指定 socket 選項的值

sock.setsockopt( lvl, optname, val )

設置指定 socket選項的值

4.編寫socket測試程序
(a)編寫server的步驟

第一步是創建socket對象。調用socket構造函數。如:
socket = socket.socket( family, type )
family參數代表地址家族,可為AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用於同一台機器上的進程間通信。
type參數代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數據報套接字)。
第二步是將socket綁定到指定地址。這是通過socket對象的bind方法來實現的:
socket.bind( address )
由AF_INET所創建的套接字,address地址必須是一個雙元素元組,格式是(host,port)。host代表主機,port代表埠號。如果埠號正在使用、主機名不正確或埠已被保留,bind方法將引發socket.error異常。
第三步是使用socket套接字的listen方法接收連接請求。
socket.listen( backlog )
backlog指定最多允許多少個客戶連接到伺服器。它的值至少為1。收到連接請求後,這些請求需要排隊,如果隊列滿,就拒絕請求。
第四步是伺服器套接字通過socket的accept方法等待客戶請求一個連接。
connection, address = socket.accept()
調 用accept方法時,socket會時入「waiting」狀態。客戶請求連接時,方法建立連接並返回伺服器。accept方法返回一個含有兩個元素的元組(connection,address)。第一個元素connection是新的socket對象,伺服器必須通過它與客戶通信;第二個元素 address是客戶的Internet地址。
第 五步是處理階段,伺服器和客戶端通過send和recv方法通信(傳輸 數據)。伺服器調用send,並採用字元串形式向客戶發送信息。send方法返回已發送的字元個數。伺服器使用recv方法從客戶接收信息。調用recv 時,伺服器必須指定一個整數,它對應於可通過本次方法調用來接收的最大數據量。recv方法在接收數據時會進入「blocked」狀態,最後返回一個字元 串,用它表示收到的數據。如果發送的數據量超過了recv所允許的,數據會被截短。多餘的數據將緩沖於接收端。以後調用recv時,多餘的數據會從緩沖區 刪除(以及自上次調用recv以來,客戶可能發送的其它任何數據)。
傳輸結束,伺服器調用socket的close方法關閉連接。
(b)編寫client的步驟
首先創建一個socket以連接伺服器:socket =socket.socket( family, type )
使用socket的connect方法連接伺服器。對於AF_INET家族,連接格式如下:
socket.connect( (host,port) )
host代表伺服器主機名或IP,port代表伺服器進程所綁定的埠號。如連接成功,客戶就可通過套接字與伺服器通信,如果連接失敗,會引發socket.error異常。
處理階段,客戶和伺服器將通過send方法和recv方法通信。
傳輸結束,客戶通過調用socket的close方法關閉連接。
5.實例源碼:python socket半雙工聊天
(a)tcpserver.py
[python] view plain
# -*- coding: cp936 -*-
#file:tcpserver.py

import socket
from time import ctime
import sys

bufsize = 1024
host = '127.0.0.1'
port = 8100
address = (host,port)

server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_sock.bind(address)
server_sock.listen(1)

while True:
print 'waiting for connection...'
clientsock,addr = server_sock.accept()
print 'received from :',addr

while True:
data = clientsock.recv(bufsize)
print ' 收到---->%s\n%s' %(ctime(),data)
data = raw_input("發送----->")
clientsock.send(data)
clientsock.close()

server_sock.close()
(b)tcpclient.py
[python] view plain
## -*- coding: cp936 -*-
##file:tcpclient.py

from socket import *
from time import ctime

bufsize = 1024
host = '127.0.0.1'
port = 8100
addr = (host,port)

client_sock = socket(AF_INET,SOCK_STREAM)
client_sock.connect(addr)

while True:
data = raw_input("發送---->")
if not data:
break
else:
client_sock.send(data)
data = client_sock.recv(bufsize)
print '收到---->%s\n%s' %(ctime(),data)

client_sock.close()

❺ delphi中的語句SendToPrinter([$1B,$7A,$31]);

給你一個源碼看看吧:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Printers,winspool, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
ComboBox1: TComboBox;
Button6: TButton;
procere Button1Click(Sender: TObject);
procere Button2Click(Sender: TObject);
procere Button4Click(Sender: TObject);
procere Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

// chs0=$1C,$26,$1C,$57,0;//中文(普通)
// chs1=$1C,$26,$1C,$57,1;//中文(四倍)
// eng=$1C,$2E,$1C,$57,0;//英文(普通)
// eng=$1C,$2E,$1C,$57,1;//英文(四倍)
// cut=$1B,$69;//切紙
// hl=$0A;//換行
// cr=$0D];//回車
// sp=$1B,$20,2;//字間間隔
// lsp=$1B,$32;//行間間隔
// hom=$1B,$3C;//行首

implementation

var
PrnHwnd:THandle;

{$R *.DFM}

procere OpenLptPrn(hp:string);
begin
PRNHwnd:=CreateFile(Pchar(hp), GENERIC_READ or GENERIC_WRITE,0,nil, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if PRNHwnd=INVALID_HANDLE_VALUE then
Exception.Create('無效並行口');
end;

procere delay(n:integer);//延時
var t:Tdatetime;
begin
t:=time;
repeat
//
until time>=t+n/24/60/60/1000;
end;

procere
SendToPrinter(SendBuf:array of byte);overload
var
tem:cardinal;
begin
WriteFile(PRNHwnd,SendBuf,High(SendBuf)+1,tem,nil);
end;

procere SendToPrinter0(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1C,$2E,ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,0,ord(SendBuf[i]),ord(SendBuf[i+1])]);
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$1C,$2E,ord(' '),$0A]);
end;

procere SendToPrinter1(SendBuf:string);overload
var
i,a:integer;
begin
a:=0;
for i:=1 to Length(SendBuf) do
begin
if a=0 then
begin
if (ord(SendBuf[i])>0)and(ord(SendBuf[i])<128) then
begin
SendToPrinter([$1C,$2E,ord(SendBuf[i])]);
end
else
begin
SendToPrinter([$1C,$26,$1C,$57,1,ord(SendBuf[i]),ord(SendBuf[i+1])]);
a:=1;
end;
end
else
begin
a:=0;
end;
end;
SendToPrinter([$0A]);
end;

procere TForm1.Button1Click(Sender: TObject);
var i:integer;s:string;
begin
if COMBOBOX1.Text='' then
s:='COM1'
else
s:=COMBOBOX1.Text;
OpenLptPrn(s);
SendToPrinter1(' 歡 迎 光 臨');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 項目: '+'押金(現金)');
SendToPrinter0(' 機號: '+'xx');
SendToPrinter0(' 金額: '+'xx.xx'+'元');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 時間:'+datetostr(date)+' '+timetostr(time));
SendToPrinter0(' 收款員:張三 ');
delay(3000);
for i:=0 to 9 do
begin
sendtoprinter([$0A]);
end;
SendToPrinter([$0D,$1B,$69]);
fileclose(PRNHwnd);
end;

procere TForm1.Button2Click(Sender: TObject);
var i:integer;s:string;
begin
if COMBOBOX1.Text='' then
s:='COM1'
else
s:=COMBOBOX1.Text;
OpenLptPrn(s);
SendToPrinter1(' 歡 迎 光 臨');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 項目:結賬 票據流水號:'+'xxx');
SendToPrinter0(' 機號:'+'xx');
SendToPrinter0(' 開始時間:'+datetostr(date)+' '+timetostr(time));
SendToPrinter0(' 結束時間:'+datetostr(date)+' '+timetostr(time));
SendToPrinter0(' 上機:'+'xx.xx'+'元 消費:'+'xx.xx'+'元');
delay(3000);
SendToPrinter0(' 附加:'+'xx.xx'+'元 電話:'+'xx.xx'+'元');
SendToPrinter0(' 其他:'+'xx.xx'+'元');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 合計:'+'xx.xx'+'元 押金:'+'xx.xx'+'元');
SendToPrinter0(' 現金:'+'xx.xx'+'元 刷卡:'+'xx.xx'+'元');
SendToPrinter0(' 退款:'+'xx.xx'+'元');
delay(3000);
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 時間:'+datetostr(date)+' '+timetostr(time));
SendToPrinter0(' 收款員:'+'xxx');
delay(2000);
for i:=0 to 10 do
begin
sendtoprinter([$0A]);
end;
SendToPrinter([$0D,$1B,$69]);
fileclose(PRNHwnd);
end;

procere TForm1.Button4Click(Sender: TObject);
var i:integer;s:string;
begin
if COMBOBOX1.Text='' then
s:='COM1'
else
s:=COMBOBOX1.Text;
OpenLptPrn(s);
SendToPrinter1(' 繳 款 憑 證');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 時 間:'+datetostr(date)+' '+timetostr(time));
SendToPrinter0(' 經手人:'+'xxx');
SendToPrinter0(' 上 機:'+'xx.xx'+'(元)');
SendToPrinter0(' 商 品:'+'xx.xx'+'(元)');
delay(2000);
SendToPrinter0(' 電 話:'+'xx.xx'+'(元)');
SendToPrinter0(' 合 計:'+'xx.xx'+'(元)');
SendToPrinter0(' 卡收入驗證:'+'xx.xx'+'(元)');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 票據流水號:'+'xxx');
delay(2000);
for i:=0 to 10 do
begin
sendtoprinter([$0A]);
end;
SendToPrinter([$0D,$1B,$69]);
fileclose(PRNHwnd);

end;

procere TForm1.Button3Click(Sender: TObject);
var i:integer;s:string;
begin
if COMBOBOX1.Text='' then
s:='COM1'
else
s:=COMBOBOX1.Text;
OpenLptPrn(s);
SendToPrinter1(' 交 接 班 報 表');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 應收現金:'+'xx.xx'+'(元)');
SendToPrinter0(' 預付押金:'+'xx.xx'+'(元)');
SendToPrinter0(' 商品收入:'+'xx.xx'+'(元)');
SendToPrinter0(' 電話收入:'+'xx.xx'+'(元)');
SendToPrinter0(' 合 計:'+'xx.xx'+'(元)');
SendToPrinter0(' -----------------------------');
SendToPrinter0(' 時間:'+datetostr(date)+' '+timetostr(time));
SendToPrinter0(' 收款員:張三 ');
delay(4000);
for i:=0 to 9 do
begin
sendtoprinter([$0A]);
end;
SendToPrinter([$0D,$1B,$69]);
fileclose(PRNHwnd);
end;

end.

❻ Linux下udp套接字sendto函數錯誤

希望能夠多貼一些代碼出來,幫助分析。
1.檢查一下sendto的參數,其中的指針參數是否初始化正確?
2.請檢查一下recvfrom的函數聲明,第6個參數的原型。

❼ 單片機控制風扇調速 具體點最好有源碼就好

#include <iom16v.h>
#include <macros.h>
#define OVER_TEMPERATURE 0x01
#define LOW_LIGHT 0X02
#define HIGH_LIGHT 0X03

#define THIS_NODE 0x12
#define CENTRAL_SITE 0x18
#define LIGHT_NODE 0x11

#define OBJ 90

/*#define KP 15
#define KI 1
#define KD 20
#define P (KP + KI + KD)
#define I (KP + 2 * KD)
#define D KD*/

typedef unsigned char uchar;
typedef unsigned int uint;

uint KP = 5;
uchar dKP = 1;
uint KI = 1;
uchar dKI = 2;
uint KD = 3;
uchar dKD = 1;

uchar table[10] = {0xf3, 0x50, 0xcb, 0xd9, 0x78, 0xb9, 0xbb, 0xd0, 0xfb, 0xf9};
uchar node[7] = {0x00, 0x0d, 0x6f, 0x00, 0x0c, 0x08, 0x09};
uchar rcv_buf[4] = {0, 0, 0, 0};
uchar command = 0;
uchar uart_flag = 0;

uchar sec = 0;
uchar minute = 0;
uchar hour = 0;
uchar wakeup = 1;

uchar key_down[4] = {0, 0, 0, 0};
uchar key_up[4] = {0, 0, 0, 0};
uchar pre_key = 0;
uchar cur_key = 0;
uchar key_chg = 0;

uchar time_chg = 0;
uchar key_timer = 0;
uchar uart_isr = 0;

typedef struct _PID{
uint set_point;

uint B;

int ek[3];
int ek_flag[3];

uint uk;
}PID;
PID sPID;

int abs(int num)
{
return ((num>0)?(num):(-num));
}
int delta_PID(PID *pp, int next_point)//增量法
{
int error;

error = pp->set_point - next_point;

pp->ek[2] = pp->ek[1];
pp->ek[1] = pp->ek[0];
pp->ek[0] = error;

return (KP*pp->ek[0] - KI*pp->ek[1] + KD*pp->ek[2]);
}
void PIDproc(PID *pp, int next_point) //帶死區控制以及抗積分飽和的PID
{
uint tmp[3] = {0, 0, 0};
uint PosSum = 0;
uint NegSum = 0;
uchar gain = 1;

if(pp->set_point > next_point){
tmp[0] = pp->set_point - next_point;//ek0
if(tmp[0] > pp->B){
pp->ek[2] = pp->ek[1];
pp->ek[1] = pp->ek[0];
pp->ek[0] = tmp[0];

pp->ek_flag[2] = pp->ek_flag[1];
pp->ek_flag[1] = pp->ek_flag[0];
pp->ek_flag[0] = 0; //當前EK為正數
tmp[0] = KP * pp->ek[0] / dKP + KI * pp->ek[0] / dKI + KD * pp->ek[0] / dKD; // KP*EK0
tmp[1] = KP * pp->ek[1] / dKP + 2 * KD * pp->ek[1] / dKD; // KI*EK1
tmp[2] = KD * pp->ek[2] / dKD; // KD*EK2
}
}
else{ //反饋大於給定
tmp[0] = next_point - pp->set_point;//ek0
if(tmp[0] > pp->B){
//數值移位
pp->ek[2] = pp->ek[1];
pp->ek[1] = pp->ek[0];
pp->ek[0] = tmp[0];
//符號移位
pp->ek_flag[2] = pp->ek_flag[1];
pp->ek_flag[1] = pp->ek_flag[0];
pp->ek_flag[0] = 1; //當前EK為負數
tmp[0] = KP * pp->ek[0] / dKP + KI * pp->ek[0] / dKI + KD * pp->ek[0] / dKD; // KP*EK0
tmp[1] = KP * pp->ek[1] / dKP + 2 * KD * pp->ek[1] / dKD; // KI*EK1
tmp[2] = KD * pp->ek[2] / dKD; // KD*EK2
}
}
/*以下部分代碼是講所有的正數項疊加,負數項疊加*/
if(pp->ek_flag[0]==0){
PosSum += tmp[0]; //正數和
}
else{
NegSum += tmp[0]; //負數和
} // KP*EK0
if(pp->ek_flag[1]!=0){
PosSum += tmp[1]; //正數和
}
else{
NegSum += tmp[1]; //負數和
} // - kI * EK1
if(pp->ek_flag[2]==0){
PosSum += tmp[2]; //正數和
}
else{
NegSum += tmp[2]; //負數和
} // KD * EK2
PosSum += pp->uk; //

if(PosSum > NegSum){ // 是否控制量為正數
tmp[0] = PosSum - NegSum;
tmp[0] *= gain;
if( tmp[0] < (uint)65000){ //小於限幅值則為計算值輸出
pp->uk = tmp[0];
}
else{
pp->uk = (uint)65000; //否則為限幅值輸出
}
}
else{ //控制量輸出為負數,則輸出0
pp->uk = 0;
}
}
void PID_init(PID* pp)
{
pp->set_point = OBJ;

pp->B = 0;

pp->ek[0] = 0;
pp->ek[1] = 0;
pp->ek[2] = 0;

pp->ek_flag[0] = 0;
pp->ek_flag[1] = 0;
pp->ek_flag[2] = 0;

pp->uk = 0;
}

void delay(int n)
{
int i = 0, j = 0;
for(i = 0; i < n; i++)
for(j = 0; j < 1000; j++);
}
void disp(int a)
{
uchar flag = 0;
PORTC = 0X01;
PORTB = table[a / 1000];
delay(3);
PORTB = 0X00;

PORTC = 0X02;
PORTB = table[a / 100 % 10];
delay(3);
PORTB = 0X00;

PORTC = 0X04;
PORTB = table[a / 10 % 10];
delay(3);
PORTB = 0X00;

PORTC = 0X08;
PORTB = table[a % 10];
delay(3);
PORTB = 0X00;
}
void delay_on(int n, uchar cur_val)
{
int i = 0, j = 0;
for(i = 0; i < n; i++)
for(j = 0; j < 30; j++)
disp(cur_val);
}
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x06;//BIT(URSEL) | 0x06;
UBRRL = 0x0b; //set baud rate lo 0x03:115.2k,0x17:19200,0x0b:38400
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
// 數據發送【發送5 到8 位數據位的幀】
void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)));
UDR = data;
}
// 數據接收【以5 到8 個數據位的方式接收數 據幀】
unsigned char USART_Receive( void )
{
while (!(UCSRA & (1<<RXC)));
return UDR;
}
void USART_TranStr(uchar data[], uchar n)
{
uchar i = 0;
for(i = 0; i < n; i++)
{
USART_Transmit(data[i]);
}
}
#pragma interrupt_handler uart_rx_isr:iv_USART_RX
void uart_rx_isr(void)
{
uchar i;
for(i = 0; i < 4; i++)
{
rcv_buf[i] = USART_Receive();
}
uart_flag = 1;
}
void scankey(void)
{
uchar tmp = 0;

DDRD &= ~0X04;
DDRC = (DDRC & 0X0F) | 0XC0;
PORTD |= 0X04;

PORTC = (PORTC & 0X0F) | 0X70;
delay(2);
tmp = PINC;
if((~tmp & 0x30) != 0)
delay(2);
tmp = PINC;

if((~tmp) & (1 << 4)){
key_timer = 0;
cur_key = 2;//test
return;
}
if((~tmp) & (1 << 5)){
key_timer = 0;
cur_key = 1;//up
return;
}

PORTC = (PORTC & 0X0F) | 0Xb0;
delay(2);
tmp = PINC;
if((~tmp & 0x30) != 0)
delay(2);
tmp = PINC;

if((~tmp) & (1 << 4)){
key_timer = 0;
cur_key = 4;//switch
return;
}
if((~tmp) & (1 << 5)){
key_timer = 0;
cur_key = 3;//time
return;
}
cur_key = 0;
}
void decidekey(void)
{
if(cur_key==0 && pre_key != 0)
{
key_up[pre_key - 1] = 1;
key_chg = 1;
}
else if(cur_key!=0 && pre_key==0)
{
key_down[cur_key - 1] = 1;
key_chg = 1;
}
else
{
key_chg = 0;
}
pre_key = cur_key;
}
void port_init(void)
{
DDRB = 0xFF;
PORTB = 0X00;

DDRC |= 0X0F;
PORTC = 0X00;

DDRA |= 0X30;
PORTA &= ~0X30;
}
void sendto(uchar no, uchar data[], uchar n)
{
USART_TranStr(node, 7);
USART_Transmit(no);
USART_TranStr(data, n);
}
void zigbeeReset(void)
{
USART_TranStr("AT+RESET", 8);
}
void zigbeeSleep(uchar TH, uchar TL)
{
uchar sleep[] = {"AT+SLEEP="};
USART_TranStr(sleep, 9);
USART_Transmit(TH);
USART_Transmit(TL);
}
void setrelay(uchar op)
{
uchar setRelay[] = {"AT+SETRELAY="};
USART_TranStr(setRelay, 12);
USART_Transmit(op);
}
void timer1_init(void)
{
TCCR1A = 0xa2; //兩路PWM,匹配清零
TCCR1B = 0x19; //快速PWM模式,位數可調,預分頻1

ICR1 = 0xFFFF;
//計數上限值,此數為16位PWM,此值的多少決定PWM的位數,改變值可以改變時鍾的輸入頻率
//在1M時鍾下,OCR1A,OCR1B=1M/65536=15HZ。改為7FFF時,為30HZ,ICR1變小,OCR1A,B成比例變大
}
void main()
{
uchar data[] = {0x01};
uchar time[] = {0x03, 21, 14, 55};
uchar send_buf[] = {0x05, 0x01, 0x00, 0x00};
uchar oldcomm[] = {0x00};
uchar flag = 0;
uchar light_obj = 500;

int a = 0;

uint PID_out = 0;
uint pre_PID_out = 0;
int delta_PID_out = 0;
int PID_in = 0;
int disp_num = 0;
CLI();
PID_init(&sPID);

uart0_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
OCR1A = a;
//OCR1B=a; //匹配初值

DDRA |= 0X20;
PORTA = 0X00;
DDRD |= 0XF8;
PORTD &= ~0XF8;
port_init();
SEI();
delay(1000);
sendto(LIGHT_NODE, send_buf, 4);
while(1)
{
if(uart_flag == 1)
{
uart_flag = 0;

PID_in = 255 - rcv_buf[1];// * 4 - rcv_buf[2];

/*pre_PID_out = PID_out;
delta_PID_out = delta_PID(&sPID, PID_in);
PID_out += delta_PID_out;
OCR1A = PID_out;*/

PIDproc(&sPID, PID_in);
OCR1A = sPID.uk;

sendto(LIGHT_NODE, send_buf, 4);
}
scankey();
decidekey();
if(key_chg && key_up[0])
{
key_up[0] = 0;
sPID.set_point += 10;
sendto(LIGHT_NODE, send_buf, 4);
}
if(key_chg && key_up[1])
{
key_up[1] = 0;
sPID.set_point -= 10;
sendto(LIGHT_NODE, send_buf, 4);
}
if(key_chg && key_up[2])
{
key_up[2] = 0;
disp_num = 0;
}
if(key_chg && key_up[3])
{
key_up[3] = 0;
disp_num = 1;
}
(disp_num == 0)?disp(PID_in):disp(PID_out / 10);
}

}//這是PID調節光照的,你自己慢慢看看,道理差不多

❽ AlertDialog dismiss 和 cancel方法的區別

兩者在效果上表現是一樣的,都是將對話框關閉。只是如果你在創建對話框時如果調用了setOnCancelListener方法,那麼cancel就會去執行這個監聽。


  • 看下cancel的源碼:

/**

* Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will

* also call your {@link DialogInterface.OnCancelListener} (if registered).

*/

public void cancel() {

if (!mCanceled && mCancelMessage != null) {

mCanceled = true;

// Obtain a new message so this dialog can be re-used

Message.obtain(mCancelMessage).sendToTarget();

}

dismiss();

}


  • 然後我們再看dismiss源碼:

/**
* Dismiss this dialog, removing it from the screen. This method can be
* invoked safely from any thread. Note that you should not override this
* method to do cleanup when the dialog is dismissed, instead implement
* that in {@link #onStop}.
*/
@Override
public void dismiss() {
if (Looper.myLooper() == mHandler.getLooper()) {
dismissDialog();
} else {
mHandler.post(mDismissAction);
}
}


  • 最後是dismissDialog方法:

void dismissDialog() {
if (mDecor == null || !mShowing) {
return;
}

if (mWindow.isDestroyed()) {
Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");
return;
}

try {
mWindowManager.removeViewImmediate(mDecor);
} finally {
if (mActionMode != null) {
mActionMode.finish();
}
mDecor = null;
mWindow.closeAllPanels();
onStop();
mShowing = false;

sendDismissMessage();
}
}


總結:

從以上源碼可以看出,cancel方法其實就是調用的dismiss方法。只是如果設置了DialogInterface.OnCancelListener監聽,那麼使用cancel的話就可以監聽關閉的事件了。

❾ Message的sendToTarget()怎麼使用的

你好,Message.sendToTarget() ---> Message.target.sendMessage(), 這里target是個Handler,所以你說的消息是發送到這個Message內部持有的Handler對象,加入他的MessageQueue。所以你要找到賦給該Message Handler的地方,在它的handleMessage里就可以看到處理了。至於在什麼地方賦的值,可以看在什麼地方調用了Message.obtain(Hanlder)或者Handler.obtainMessage()這類的函數

熱點內容
洗過的海帶存儲方法 發布:2024-10-10 11:19:00 瀏覽:239
64H的源碼 發布:2024-10-10 11:06:01 瀏覽:152
mc伺服器怎麼增加back指令 發布:2024-10-10 10:58:48 瀏覽:256
termux如何搭建伺服器 發布:2024-10-10 10:18:05 瀏覽:737
中國石化的電話服務密碼是多少 發布:2024-10-10 10:16:46 瀏覽:42
婚紗店宣傳片視頻腳本 發布:2024-10-10 10:08:55 瀏覽:869
android寫入文件 發布:2024-10-10 10:08:11 瀏覽:435
怎麼打開文件夾的路徑 發布:2024-10-10 10:08:06 瀏覽:61
ec伺服器怎麼有小提示 發布:2024-10-10 10:08:04 瀏覽:495
我的世界迪士尼神奇寶貝伺服器地址 發布:2024-10-10 09:03:02 瀏覽:560